目录
0.引言
在我的博文《一看就懂-c语言单向链表【初阶】》中,已经分享了如何做一个链表来代替数组。那么本文就将分享如何利用之前做过的单向链表进行查找链表中的元素,删除链表中的元素,和清空整个链表。
先附上已经可以进行打印的链表代码:
#include<stdio.h> #include<stdlib.h> typedef struct _node { int value; struct _node *next; } node; int main() { int number; node *head=NULL; printf("please input the number into linked-list!\n"); do { scanf("%d",&number); if(number!=-1) { node *p; p=(node*)malloc(sizeof(node)); p->value=number; p->next=NULL; node* last=head; if(last) { while(last->next) { last=last->next; } last->next=p; } else { head=p; } } } while(number!=-1); node *d; for(d=head;d;d=d->next) { printf("%d ",d->value); } return 0; }
此链表输入可以记录数据,输入-1结束输入,进行打印链表中的所有数据。
1.链表的查找
int find; printf("input a number to find it and delete it\n"); scanf("%d",&find); node *p; int t=0; for(p=head; p; p=p->next) { if(p->value==find) { printf("I get it!\n"); t=1; } } if(t==0) { printf("Do not have this number!\n"); }
链表的查找较为简单,其实和链表的顺序打印异曲同工,都是从头开始,然后查找链表是否存在那个值。
2.链表的删除
//链表的删除
node *q;
for(q=0,p=head; p; q=p,p=p->next) {
if(p->value==find) {
if(q) {
q->next=p->next;
} else {
head=p->next;
}
free(p);
break;
}
}
node *kl;
for(kl=head; kl; kl=kl->next) {
printf("%d ",kl->value);
}
我们在链表中进行删除,并不是说要删除这个节点中的那个储值的元素,而是要将整个节点删除,同时又要保证前后节点依然能连接起来。
删除节点,只需要将图中的①直接指向第三个节点就ok了,所以这里我们就需要一个node *q去记录每一次的p,当查找到要删除的数时,让q->next=p->next就ok了。但是这里也要注意一个细节:我们要先判断q是否存在,如果q=0则让head发生改变:head=p->next。最后要free(p)也就是删除这个节点!
后面一部分就是对删除后的链表进行的打印!
3.链表的清空
//链表的清除 for(p=head; p; p=q->next) { q=p; free(p); } q=NULL; p=NULL;
这里同样从头开始进行每一个节点的free,但是为了清空节点后同样让链表往后走,就需要一个q=p进行记录。
4.全部整合代码:
#include<stdio.h> #include<stdlib.h> typedef struct _node { int value; struct _node *next; } node; int main() { int number; node *head=NULL; printf("please input the number into linked-list!\n"); do { scanf("%d",&number); if(number!=-1) { node *p; p=(node*)malloc(sizeof(node)); p->value=number; p->next=NULL; node* last=head; if(last) { while(last->next) { last=last->next; } last->next=p; } else { head=p; } } } while(number!=-1); node *d; for(d=head;d;d=d->next) { printf("%d ",d->value); } printf("\n"); //链表的寻找 int find; printf("input a number to find it and delete it\n"); scanf("%d",&find); node *p; int t=0; for(p=head; p; p=p->next) { if(p->value==find) { printf("I get it!\n"); t=1; } } if(t==0) { printf("Do not have this number!\n"); } //链表的删除 node *q; for(q=0,p=head; p; q=p,p=p->next) { if(p->value==find) { if(q) { q->next=p->next; } else { head=p->next; } free(p); break; } } node *kl; for(kl=head; kl; kl=kl->next) { printf("%d ",kl->value); } //链表的清除 for(p=head; p; p=q->next) { q=p; free(p); } q=NULL; p=NULL; return 0; }
运行截图:
5.总结
单向链表的基本操作就是这些,当然这是相对简单的单向链表制作,之后博主还会在此基础上进行链表的优化,同时也会更新双向链表,循环链表的内容。如果此文对您有一丝丝帮助的话,请高抬贵手点个关注点个赞。谢谢!