在长度大于1的循环列表中,既无头结点也无根结点,S维指向列表中的某个节点指针,删除这个S结点的前续结点只限明天下午之前!
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/08 01:28:59
在长度大于1的循环列表中,既无头结点也无根结点,S维指向列表中的某个节点指针,删除这个S结点的前续结点只限明天下午之前!
在长度大于1的循环列表中,既无头结点也无根结点,S维指向列表中的某个节点指针,删除这个S结点的前续结点
只限明天下午之前!
在长度大于1的循环列表中,既无头结点也无根结点,S维指向列表中的某个节点指针,删除这个S结点的前续结点只限明天下午之前!
#include
#include
#include
#include
struct m
{
int data;
struct m *next;
};
typedef struct m LB;
LB *creat(void);
void out(LB *);
void del(LB *);
void main()
{
LB *head=NULL;
if((head=creat())==NULL)
{
printf("链表建立失败~!\n");
exit(0);
}
del(head);
}
LB *creat(void)
{
LB *head=NULL,*p,*s;
char c[5];
int i=1,x;
system("CLS");
s=(LB *)malloc(sizeof(LB));
printf("请输入数据:");
gets(c);
s->data=atoi(c);
while(i)
{
if(head==NULL) head=s;
else p->next=s;
p=s;
printf("请输入数据(ok结束,输入后按回车继续输入):");
gets(c);
if(strcmp(c,"ok")==0) break;
s=(LB *)malloc(sizeof(LB));
s->data=atoi(c);
}
p->next=head;
return head;
}
void out(LB *head)
{
LB *p=head;
do
{
printf("%6d",p->data);
p=p->next;
}while(head-p);
printf("\n");
}
void del(LB *head)
{
LB *s,*p,*q; //p为s的前续,q为p的前续
int x,find=0;
printf("原数据:\n");
out(head);
printf("输入s所指的数据:");
scanf("%d",&x);
q=head;
p=q->next;
s=p->next;
do
{
if(s->data==x)
{
find=1;
break;
}
q=p;
p=s;
s=s->next;
}while(q!=head);
if(find==0)
{
printf("数据没找到!");
return;
}
printf("删除s前续数据前各结点数据:\n");
out(head);
if(p==head)
head=s;
q->next=p->next;
free(p);
printf("删除s前续数据后各结点数据:\n");
out(head);
}