链表的删除
神呐,我的删除部分错哪了,求救啊
给定一个空链表,请按如下命令进行操作。
输入格式
第一行一个整数N,表示有N(N<=100)个命令
第二行至第N+1行,每行一个命令,命令的所有可能形式如下:
A k
表示向当前链表加入一个值为k的整数(k的绝对值小于INT_MAX)。
Q
表示查询
D k
表示删除当前链表中值为k的所有元素。符合条件的元素可能不存在。
输出格式
对于A命令和D命令,程序不输出。对于每个Q命令,输出占一行,按元素的值从小到大的顺序输出链表中的所有元素,元素之间以一个空格分开。详细见样例。
样例输入
7
A 3
A 2
Q
D 2
Q
A 0
Q
样例输出
2 3
3
0 3
#include<stdio.h>
#include<stdlib.h>
#define len sizeof(struct s)
struct s
{
int num;
struct s * next;
};
int main ()
{
int k,i,n;
char t,str[20];
struct s *head=NULL;
struct s *p,*p1,*p2,*q1,*q2,*r;
scanf("%d",&n);
gets(str);
for(i=0;i<n;i++)
{
gets(str);
sscanf(str,"%c%d",&t,&k);
if(t=='A')
{
scanf("%d",&k);
if(head==NULL) //若头指针为空,将head指向num为k的指针p
{
p=(struct s*)malloc(len);
p->num=k;
p->next=NULL;
head=p;
}
else
{
p=(struct s*)malloc(len); //头指针不为空,开始从小到大排
p->num=k;
p1=p2=head;
while((p1->num<p->num)&&(p1->next!=NULL)) //条件:要找比k大的数,否则一个一个往下找
{
p2=p1;
p1=p1->next;
}
if((p1->num>p->num)&&(p1->next==NULL)) //
{
head=p;
p->next=p1;
}
if((p1->num>p->num)&&(p1->next!=NULL))
{
if(p1==head)
{
head=p;p->next=p1; //若在表头
}
else
{
p2->next=p; //在表中
p->next=p1;
}
}
if((p1->next==NULL)&&(p1->num<p->num)) //在表尾
{
p1->next=p;
p->next=NULL;
}
}
}
else if(t=='D') //对于删除命令的处理
{
scanf("%d",&k);
if(head==NULL) //空指针不做处理
continue;
else
{
q1=q2=head;
while(p1->num!=k&&p1->next!=NULL) //找相同的数字
{
q2=q1;
q1=q1->next;
}
if(q1->num==k)
{ //在表头
if(q1==head)
head=q1->next;
else //在表中
q2->next=q1->next;
}
else // 不存在k
continue;
}
}
else if(t=='Q') //对于输出的处理
{
if(head==NULL) // 空表不处理
continue;
else
{
r=head;
while(r!=NULL)
{
printf("%d ",r->num); //直接输出
r=r->next;
}
printf("\n");
}
}
}
return 0;
}