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);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统