C语言删除链表问题

#include<stdio.h>#include<malloc.h>structnote{intdata;structnote*next;};typedefstruct... #include<stdio.h>
#include<malloc.h>
struct note
{
int data;
struct note *next;
};
typedef struct note AA;
int n;
void main()
{
AA *creat();
void print(AA *head);
AA *head;
head=creat();
print(head);
int i;
printf("please input the delete data:\n");
scanf("%d",&i);
AA *del(AA *head,int num);
head=del(head,i);
print(head);
}
AA *creat()
{
n=0;
AA *h,*r,*s;
r=s=(AA *)malloc(sizeof(AA));
scanf("%d",&s->data);
h=NULL;
while(s->data!=0)
{
n=n+1;
if(n==1)h=s;
else
r->next=s;
r=s;
s=(AA *)malloc(sizeof(AA));
scanf("%d",&s->data);
}

r->next=NULL;
return h;

}
void print(AA *head)
{
AA *p;
p=head;
if(head==NULL)
printf("There is no list!\n");
else
{
printf("There %d records are:\n",n);
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
}
AA *del(AA *head,int num)
{
AA *p1,*p2;
if(head==NULL)
{
printf("\nNULL!\n");
goto end;
}
p1=head;
while(p1->data!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->data==num)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("delete:%d\n",num);
n=n-1;
}
else printf("%d not be found!\n",num);
end:
return head;
}
菜鸟写的,可是只能删除一个链表结点,比如建立数据域为1,2,3,1,2,3的6个结点的链表,输入要删除的结点1时,只能删除第一个结点1,输出2,3,1,2,3,第二个1没有删除,如何改程序让它一次将几个相同的一起删除?求高手指教,谢谢!!
展开
 我来答
lona185
2012-05-28
知道答主
回答量:9
采纳率:0%
帮助的人:6.2万
展开全部
用这个程序到处回答问题 发财了我 你看下原码了 ,不懂可以问我的 ,必须要采纳哦
理解二级指针就都好办了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student //定义节点类型
{
char name[20];
int age;
struct student *next;
};
typedef struct student * list; //定义节点的指针类型
void insert(list *ll,int age,char name[]) //插入元素
{
list p=(list)malloc(sizeof(struct student));
p->age=age;
strcpy(p->name,name);
p->next=NULL;
while(*ll!=NULL)
{
ll=&((*ll)->next);
}
*ll=p;
}
void remove(list *ll,char name[]) //ll为指向指针的指针,name[]为你要删除的姓名
{
list p=*ll; //定义p指向链表的头指针
while((p=*ll)!=NULL)
{
if(strcmp(p->name,name)==0) // 等于进入,删除节点后不往下跳
{
*ll=(*ll)->next; //删除链表中一个节点
delete p;//释放内存
}
else
ll=&((*ll)->next); //不等于往下跳一个节点
}

}
int main()
{
list ll=NULL; //定义头指针 赋值空
insert(&ll,20,"lona"); //插入元素
insert(&ll,20,"lona");
insert(&ll,20,"lona");
insert(&ll,20,"lona");
insert(&ll,20,"hello");
remove(&ll,"lona"); //删除相同的元素
while(ll!=NULL) //打印结构 仅仅调试而已,这样做会破坏链表 建议用临时指针来打印
{
printf("%d,%s\n",ll->age,ll->name);
ll=ll->next;
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
郝在益
2012-05-12 · TA获得超过2079个赞
知道小有建树答主
回答量:1496
采纳率:54%
帮助的人:634万
展开全部
这个就需要你判断了,你首先需要将链表的数据全部遍历一遍,在遍历的同时就判断该数据是否为你要删除的数据,如果是,就删除,继续遍历……一直到结束,这样就可以吧1全部删除了。
满意请采纳!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
741852963一
2012-05-12 · TA获得超过268个赞
知道小有建树答主
回答量:354
采纳率:0%
帮助的人:213万
展开全部
del函数while改为:while(p1!=NULL){
while(p1->data!=num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->data==num)
{
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
printf("delete:%d\n",num);
n=n-1;
}p1=p1->next;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jellycgl
2012-05-12 · TA获得超过417个赞
知道小有建树答主
回答量:1149
采纳率:66%
帮助的人:895万
展开全部
STL源码 remove
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式