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没有删除,如何改程序让它一次将几个相同的一起删除?求高手指教,谢谢!! 展开
#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没有删除,如何改程序让它一次将几个相同的一起删除?求高手指教,谢谢!! 展开
4个回答
展开全部
用这个程序到处回答问题 发财了我 你看下原码了 ,不懂可以问我的 ,必须要采纳哦
理解二级指针就都好办了
#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;
}
}
理解二级指针就都好办了
#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;
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个就需要你判断了,你首先需要将链表的数据全部遍历一遍,在遍历的同时就判断该数据是否为你要删除的数据,如果是,就删除,继续遍历……一直到结束,这样就可以吧1全部删除了。
满意请采纳!
满意请采纳!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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;
}
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;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
STL源码 remove
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询