PTA作业(链表2)--编程题

  • 单链表基本操作

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。
输入格式:
输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。
输出格式:
输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。
输入样例:

5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0 
1 6

输出样例:
7 1 2 8 3 5

部分正确

点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Node
{
    int data;
    Node *next;
};
Node *create(int n)
{
    Node *head = NULL, *p, *q;
    while (n--)
    {
        p = new Node;
        int dataa;
        cin >> dataa;
        p->data = dataa;
        p->next = NULL;
        if (head == NULL)
        {
            head = q = p;
        }
        else
        {
            q->next = p;
            q = p;
        }
    }
    return head;
}
Node *Delete(Node *head, int k,int size)
{
    if(head==NULL)return head;
    Node *p;
    p = head;
    int i;
    if (k == 1)
    {
        p = head;
        head = head->next;
        delete p;
        return head;
    }
    for (i = 1; i < k-1; i++)
    {
        p = p->next;
        // cout<<p->data<<endl;
    }
  
    if (k == size)
    {
        p->next = NULL;
        return head;
    }
    else
    {
        p->next = p->next->next;
    }
    return head;
}
Node *insert(Node *head, int pos, int val,int size)
{
  
    Node *p,*q;
      if(head==NULL){
        p = new Node;
        p->data = val;
        p->next=NULL;
        head=p;
         return head;
    }
    if (pos == 0)
    {
        p = new Node;
        p->data = val;
        p->next = head;
        head = p;
        return head;
    }
    else
    {
            p = head;
            for (int i = 1; i < pos; i++)
            {
                p = p->next;
            }
            if(p->next==NULL){
                q = new Node;
                q->data = val;
                q->next=NULL;
                return head;
            }
            Node *newp = new Node;
            newp->data = val;
            newp->next = p->next;
            p->next = newp;
            return head;
    }
}
void Print(Node *head)
{
    Node *p;
    p = head;
    while (p)
    {
        cout << p->data << " ";
        p = p->next;
    }
}
int main()
{
    int n;
    cin >> n;
    int size;
    size = n;
    Node *head;
    head = create(n);
    int repeat;
    cin >> repeat;
    int k, flag;

    while (repeat--)
    {
        cin >> flag;
        if (flag == 1)
        {
            cin >> k;
            if (k == 0 || k > size)
                continue;
            else
            {
                head = Delete(head, k,size);
                size--;
                //  Print(head);
            }
        }
        if (flag == 0)
        {
            int pos, val;
            cin >> pos >> val;
            if(pos>(size+1))continue;
            head = insert(head, pos, val,size);
            //  Print(head);
            size++;
        }
    }
    Print(head);
    return 0;
}

AC代码

点击查看代码
#include<iostream>
using namespace std;
struct node {
	int num;
	node* next;
	node(int n) {
		num = n;
		next = NULL;
	}
};//结点

int main() {
	int n = 0, m = 0, order = 0, k = 0, d = 0, a = 0,length=0;
	node* head = NULL, * last = NULL, * p1 = NULL,*p2=NULL; 
	cin >> n;
	length = n;
	for (int i = 0; i < n; i++) {
		cin >> a;
		if (i ==0) {
			last=head = new node(a);//头结点,但是建议不要像我这么干,最好放在循环外
		}
		else {
			last = last->next = new node(a);//尾插
		}
	}//构造链表
	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> order;
		p1 = head;
		if (order == 0) {
			cin >> k >> d;
			if (k>length) { continue; }
			if (k == 0) {
				p1 = new node(d);
				p1->next = head;
				head = p1;
			}
			else {
				while (k != 1) {
					p1 = p1->next;
					k--;
				}
				p2 = new node(d);
				p2->next = p1->next;
				p1->next = p2;
				
			}
			length++;
		}//order==0时对链表进行相应操作
		else {
			cin >> k;
			if (k > length||k==0) { continue; }
			if (k == 1) {
				head = head->next;
			}
			else {
				while (k != 2) {
					p1 = p1->next;
					k--;
				}
				p2 = p1->next;
				p1->next = p2->next;

			}
			length--;
		}
	}
	p1 = head;
	while (p1 != NULL) {
		cout << p1->num<<" ";
		p1 = p1->next;
	}
	return 0;
}
  • 链表操作-插入、查找和删除

请编写创建链表和输出链表的函数。对于以下数据结点的结构定义,
针对带头结点的链表,请编程完成以下功能。
struct LNode{
int data; //数据域
struct LNode *next; //指针域
};
struct LNode *head; //头指针
输入数据包含若干组命令和数据,一组数据中的第1个字符代表命令,
接下来的是该命令需要的数据。
(1)如果命令是I,功能为创建空链表,对应函数:void List_Init(head);
(2)如果命令是A,后跟一个整数data,功能为向链表尾部追加一个数据data,
对应函数:void List_Append(head,data);
(3)如果命令是C,后跟一个整数N,再跟N个整数,功能为向链表尾部追加N个
数据,可通过调用List_Append()函数实现;
(4)如果命令是P,功能遍历输出链表中所有数据,数据间用一个空格分隔,对应
函数:void List_print(head),如果链表未建立,输出“List not defined!”,
如果链表为空输出:“List is empty!”。
(5)如果命令是N,后跟一个整数n和d,功能为向链表的第n个位置插入数据d,
可通过调用List_Insert(head,n,d)函数实现;
(6)如果命令是F,后跟一个整数d,功能为在链表查找数据d,返回其位序,若
找不到返回-1。可通过调用List_Find(head,d)函数实现;
(7)如果命令是D,后跟一个整数n,功能为删除链表第n个位置的数据,可通过
调用List_Delete(head,n)函数实现。
输入格式:
若干组命令和数据,很多命令和数据写在一起请注意识别。
输出格式:
根据输入命令输出相应内容,详见输出样例。
输入样例:

I C 5 100 200 300 400 500 P
F 500 N 3 23 N 5 31 P
D 4 P F 99
A 6 P

输出样例:

100 200 300 400 500
index:5
100 200 23 300 31 400 500
100 200 23 31 400 500
Not Found!
100 200 23 31 400 500 6
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct Node
{
    int data;
    Node *next;
};
int flag=0;
Node *List_Append(Node *head, int data){
    Node *p = head;
    Node *q = new Node;
    q->data = data;
    q->next = NULL;
    if(head==NULL){
        head=q;
        return head;
    }
   while (p->next != NULL){
        p = p->next;
    }
    p->next = q;
    return head;
}


void Print_List(Node *head)
{
    Node *p = head;
    if (flag == 0)
    {
        cout << "List not defined!" << endl;
        return;
    }
    if (head == NULL && flag == 1)
    {
        cout << "List is empty!" << endl;
        return;
    }
    else
    {
        while (p != NULL)
        {
            if(p->next==NULL)cout << p->data;
            else  cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }
    return;
}

Node *insert(Node *head, int pos, int val)
{

    Node *p, *q;
    if (head == NULL)
    {
        p = new Node;
        p->data = val;
        p->next = NULL;
        head = p;
        delete p;
        return head;
    }
    else
    {
        p = head;
        for (int i = 1; i < pos-1; i++)
        {
            p = p->next;
        }
        Node *newp = new Node;
        newp->data = val;
        newp->next=NULL;
        newp->next = p->next;
        p->next = newp;
        return head;
    }
}
int List_Find(Node *head, int num)
{
    Node *p = head;
    int pos = 1;
    while (p != NULL)
    {
        if (p->data == num)
        {
            return pos;
        }
        p = p->next;
        pos++;
    }
    return -1;
}
Node *Delete(Node *head, int k)
{
    if (head == NULL)
        return head;
    Node *p;
    p = head;
    int i;
    if (k == 1)
    {
        p = head;
        head = head->next;
        delete p;
        return head;
    }
    for (i = 1; i < k - 1; i++)
    {
        p = p->next;
        // cout<<p->data<<endl;
    }
    p->next = p->next->next;
    return head;
 
}
int main()
{
    char command;
    Node *head = NULL;
    while (cin >> command)
    {
        if (command == 'I')
        {
            flag = 1;
        }
        else if (command == 'C')
        {
    
         
            int cnt;
            int num;
            cin >> cnt;
            for (int i = 0; i < cnt; i++)
            {
                cin >> num;
                if(flag==0)continue;
                head = List_Append(head, num);
                
            }
        }
        else if (command == 'P')
        {
            Print_List(head);
        }
        else if (command == 'A')
        {
            
            int num;
            cin >> num;
            if(flag==0)continue;
            head = List_Append(head, num);
           
        }
        else if (command == 'N')
        {
           
            int pos, val;
            cin >> pos >> val;
             if(flag==0)continue;
            head = insert(head, pos, val);
            
        }
        else if (command == 'F')
        {
            
            int find_num;
            cin >> find_num;
             if(flag==0)continue;
            int ans = List_Find(head, find_num);
            if (ans == -1)
            {
                cout << "Not Found!" << endl;
            }
            else
            {
                cout << "index:" << ans << endl;
            }
        }
        else if (command == 'D')
        {
             
            int pos;
            cin >> pos;
            if(flag==0)continue;
//             cout<<s<<"test"<<endl;
            head = Delete(head, pos);
            
        }
    }
}
posted @   21CodeXin  阅读(354)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示