【C】利用单链表数据结构实现通讯录,链表的增删改查

来源:互联网 发布:数据挖掘要学哪些东西 编辑:程序博客网 时间:2024/05/16 13:59

C语言中实现链表,是需要利用到C语言中比较难的结构体与指针才能实现。

结构体中放一个指向后接节点的指针与每一个结点应该存放的信息。

下面做一个命令行的通讯录来说明链表的增删改查这个问题。

一开始让用户输入链表,按1可以输出,按3可以删除。


可以修改:


可以插入。


按0则可以退出:


代码如下:

#include<stdio.h>#include<stdlib.h>typedef struct Linklist{char name[10];//存放名字char num[10];//存放电话号码struct Linklist *next;}Linklist,*LNode;//创建链表void create(Linklist *L){char flag='y';Linklist *p,*s;p=L;puts("创建一个通讯录:");while(flag=='Y'||flag=='y'){//初始化生成块s=(LNode)malloc(sizeof(Linklist));printf("姓名:");scanf("%s",s->name);printf("号码:");scanf("%s",s->num);//尾插法核心语句开始s->next=NULL;//注意封口p->next=s;p=s;//尾插法核心语句结束//吃换行符getchar();printf("继续输入?(y/n)");scanf("%c",&flag);}}//输出链表void output(Linklist *L){Linklist *p;p=L->next;puts("编号\t姓名\t号码");//表头puts("====\t====\t====");//华丽的分割线int count=1;while(p){printf("%d\t%s\t%s\n",count,p->name,p->num);p=p->next;count++;}}//修改链表中的某一项void update(Linklist *L){Linklist *p;p=L;int n;puts("需要修改哪一项?");scanf("%d",&n);for(int i=1;i<n+1;i++){p=p->next;//把指针移位到需要修改的一项}if(p==NULL){puts("没有这项!");}else{printf("姓名:");scanf("%s",p->name);printf("号码:");scanf("%s",p->name);}}//在链表尾部插入一项void insert(Linklist *L){Linklist *p,*s;p=L;while(p->next){//尾插法,直接把指针移位到尾部p=p->next;}//初始化生成块s=(LNode)malloc(sizeof(Linklist));printf("姓名:");scanf("%s",s->name);printf("号码:");scanf("%s",s->num);//尾插法核心语句开始s->next=NULL;//注意封口p->next=s;//只插入一项,无须p=s//尾插法核心语句结束}//在链表中删除一项void del(Linklist *L){//不写delete是因为delete是C语言的关键字Linklist *p,*q;p=L;int n;puts("需要删除哪一项?");scanf("%d",&n);//这里的指针定位不同于修改,我们需要把指针定位到要删除的前一项,进行删除for(int i=1;i<n;i++){p=p->next;}if(p==NULL){puts("没有这项!");}else{//删除的核心语句q=p->next;p->next=q->next;free(q);}}void main(){Linklist *L;int i=255;L=(LNode)malloc(sizeof(Linklist));//熟记malloc的用法,词句为开创一个长为Linklist的空间,而后被L所指向L->next=NULL;//此处头结点的尾指针必须封口,否则不同的编译器会编译出不同的成分。create(L);while(i!=0){puts("\n功能:\n1.输出\t2.修改\t3.删除\t4.插入\t0.退出");scanf("%d",&i);switch(i){case 1:output(L);break;case 2:update(L);break;case 3:del(L);break;case 4:insert(L);break;}}}

链表的各类增删改查操作写在各个函数了。

其实也不难,

链表的增加采用尾插法,先开辟一个结点空间,用一个指针所指,把操作的指针移到结点的最后,连接新开辟的结点

删除一项先把指针移到要删除的项之前,再用一个指针移到要删除的项,删除完毕,把前一项的后接指针移到下两项

查询、修改最简单,只是一个单纯的指针移动过程。

0 0
原创粉丝点击