大三今日总结

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

include<stdio.h>

include<malloc.h>

typedef struct node{
int data;
struct node* next;
}linklist;
int main()
{
linklist head,mid,r,h,b,v,p,l,j;
head=(linklist
)malloc(sizeof(linklist));
mid=r=p=head; //保存头节点位置
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int a;
scanf("%d",&a);
mid=(linklist)malloc(sizeof(linklist));
mid->data=a;
head->next=mid; //将新节点指向表尾
head=mid; //把head移动到表尾
}
head->next=NULL; //指向空地址
r=r->next;
int m,num=0,d=0;
b=l=r; //保存头节点下一位的地址
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int t;
scanf("%d",&t);
if(t0) //判断插入
{
int e,s;
scanf("%d%d",&e,&s);
if(e<=n+num+1-d) //每次插入或删除后链表长度改变
{
if(e
0) //e=0,就是头插法
{
h=(linklist
)malloc(sizeof(linklist));
h->data=s;
p->next=h; //插入头节点后面
b=h; //把b移动到h的位置
b->next=l; //指向原来的头节点后一位
}
else
{
num++;
r=b; //保证每次都是从头节点后一位开始
for(int k=1;k<e;k++)
{
r=r->next; //找到需要插入的地址
}
v=r->next; //保存插入地址的下一位
h=(linklist*)malloc(sizeof(linklist));
h->data=s;
r->next=h;
h->next=v; //指向后一位
}
}
}
if(t1) //判断删除
{
int c;
scanf("%d",&c);
if(c
n+num-d+1) //尾插
{
d++;
r=b;
for(int z=0;z<c-2;z++)
{
r=r->next;
}
r->next=NULL;
}
if(c>0&&c<n+num-d+1) //每次操作后链表长度改变,判断需要删除的节点是否合法
{
d++;
r=b;
for(int y=0;y<c-2;y++)
{
r=r->next;
}
j=r->next;
r->next=j->next;
free(j); //删除节点
}
}
}
for(;b!=NULL;)
{
printf("%d ",b->data); //从头节点的后一位逐个输出
b=b->next; //输出一个数据,地址移动到下一位
}
}

posted @ 2026-01-13 23:49  C(5,3)  阅读(10)  评论(0)    收藏  举报