用链表写的一个通讯录
生活随笔
收集整理的這篇文章主要介紹了
用链表写的一个通讯录
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu),其應(yīng)用很廣,要靈活使用鏈表就需要了解鏈表其中一些機(jī)制。本人在初略鏈表知識(shí)下完成了一個(gè)用鏈表實(shí)現(xiàn)的一個(gè)同學(xué)通訊錄,他可以實(shí)現(xiàn)增,刪,改 ,查,和遍歷輸出,經(jīng)過本人親自調(diào)試,可以運(yùn)行成功。看懂本程序可以對(duì)鏈表的知識(shí)和應(yīng)用有初步提升。希望能幫到大家。如果有什么不理解的地方可以留言,我會(huì)經(jīng)?;貋砜?#xff0c;力所能及說出本人寫的思想和具體步驟的作用。當(dāng)然覺得不足之處也歡迎提出,這樣也可以方便我也可以提升自身水平。謝謝瀏覽!
{
?printf("若您輸入完畢請(qǐng)?jiān)谙乱淮屋斎雽W(xué)號(hào)輸為0即可。\n")?;
?STU *p1,*p2,*head;
?int n=0;
?p1=p2=(STU*)malloc(LEN); ? ? ? ? //創(chuàng)建鏈表第一個(gè)元素。
?printf("請(qǐng)輸入該同學(xué)的學(xué)號(hào):\n");
?scanf("%d",&p1->num);
?printf("請(qǐng)輸入該同學(xué)的姓名:\n");
?? scanf("%s",p1->name);
?printf("請(qǐng)輸入該同學(xué)的住址:\n");
?scanf("%s",p1->addr);
?printf("請(qǐng)輸入該同學(xué)的電話:\n");
?scanf("%s",p1->tel);?
?while(p1->num!=0)
?{
??n++;
??if(n==1)
? ? ? head=p1;
??p1=(STU*)malloc(LEN); ? ? ? ? ? //創(chuàng)建下一個(gè)是否要接入鏈表的元素。
??printf("請(qǐng)輸入該同學(xué)的學(xué)號(hào):\n");
??scanf("%d",&p1->num);
??printf("請(qǐng)輸入該同學(xué)的姓名:\n");
?? ?scanf("%s",p1->name);
??printf("請(qǐng)輸入該同學(xué)的住址:\n");
??scanf("%s",p1->addr);
??printf("請(qǐng)輸入該同學(xué)的電話:\n");
??scanf("%s",p1->tel);?
? p2->next=p1; p2=p1; } p2->next=NULL;
?return head;
}
STU *add(STU *head,long index)?????? // 增添新成員。
{
?STU *p1,*p2,*p3;
?p3=(STU *)malloc(LEN);
?printf("請(qǐng)輸入要插入的同學(xué)的學(xué)號(hào):\n");
?scanf("%d",&p3->num);
?printf("請(qǐng)輸入要插入的同學(xué)的姓名:\n");
?? scanf("%s",p3->name);
?printf("請(qǐng)輸入要插入的同學(xué)的住址:\n");
?scanf("%s",p3->addr);
?printf("請(qǐng)輸入要插入的同學(xué)的電話:\n");
?scanf("%s",p3->tel);?
?if(head==NULL)
?{
??printf("這是一個(gè)空鏈表!");
?}
?else
{
??p1=p2=head;
?while(p1->next!=NULL && p1->num!=index)
?{
??p2=p1;??
??p1=p1->next;
??
?}
?if(p1->num==index)
?{
??if(p1==head) ? ? //插頭。
??{
???head=p3;
???p3->next=p1;
??}
?
??else ? ? ? ? ? // 插中間
??{
???p2->next=p3;
???p3->next=p1;
??}
??
?}
?else ? ? ? ? //插尾。
?{
??p1->next=p3;
??p3->next=NULL; } }
?return head;
}
STU *del(STU *head,char name[30])?????? // 刪除某位成員。
{
?STU *p1,*p2;
?if(head == NULL.)
??{
???printf("這是一個(gè)空鏈表!\n"); }
?else
?{
??p1=head;
?while(p1->next != NULL && strcmp(p1->name,name)!=0)
?{
??p2=p1;
??p1=p1->next;
?}
?if(strcmp(p1->name,name)==0)
?{
??if(p1 == head)
??{
???head=p1->next;
???
??}
??else
??{
???p2->next=p1->next;
??}
?}
?else
?{
??printf("沒有您要?jiǎng)h除的同學(xué)!\n");
?}
?}
?
?return head;
}
STU *upd(STU *head,char name[30])??? //? 修改某位成員的信息。
{
?STU *p;
?if(head==NULL)
??{
???printf("這是一個(gè)空鏈表!\n"); }
?else
?{
??printf("%s\n",name);
??p=head;
??while(p->next!=NULL && strcmp(p->name,name)!=0)
??{
???p=p->next;
??}
??if(strcmp(p->name,name)==0)
??{
???printf("請(qǐng)輸入該同學(xué)更改后的學(xué)號(hào):\n");
???scanf("%d",&p->num);
???printf("請(qǐng)輸入該同學(xué)更改后的姓名:\n");
?? ??scanf("%s",p->name);
???printf("請(qǐng)輸入該同學(xué)更改后的住址:\n");
???scanf("%s",p->addr);
???printf("請(qǐng)輸入該同學(xué)更改后的電話:\n");
???scanf("%s",p->tel);?
??}
??else
??{
???printf("沒有您想要更改的同學(xué)信息\n");
??}
?}
?return head; }
STU *look(STU *head,char name[30])??? // 查看某位成員信息。
{
?STU *p;
?if(head==NULL)
??{
???printf("這是一個(gè)空鏈表!\n"); }
?else
?{
??p=head;
??while(p->next!=NULL && strcmp(p->name,name)!=0)
??{
???p=p->next;
??}
??if(strcmp(p->name,name)==0)
??{
???printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
??}
?else
??{
???printf("沒有您想要查看的同學(xué)信息\n");
??}
?}
?
}
void print(STU *head)???? //遍歷所有成員信息。
{
?STU *p;
?p=head;
?if(head!=NULL)
??do
???{
????printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
????p=p->next;
???}
??while(p!=NULL);
}
int main()
{
?int a;
?long index;
?
? printf("************?? 歡迎來到........通訊錄!? **************************? \n ");
?printf("請(qǐng)您初始化您的鏈表:\n");
?STU *head;
?head=create();
?while(1)
?{
??char name[30];
??printf("請(qǐng)您輸入您想要的操作: 1:增加節(jié)點(diǎn); 2:刪除節(jié)點(diǎn); 3更新節(jié)點(diǎn); 4:查找節(jié)點(diǎn) ;? 5:輸出鏈表所以內(nèi)容? ;6 :退出。\n");
??scanf("%d",&a);
??switch(a)
??{
???case 1:
???{
????printf("您想將節(jié)點(diǎn)插在學(xué)號(hào)為多少的同學(xué)的前面:");
????scanf("%d",&index);?
????head=add(head,index);
????break;
???} case 2:
???{
????
????printf("您想刪除的節(jié)點(diǎn)的同學(xué)的姓名為:\n");
????scanf("%s",name);????
????head = del(head,name);
????break;
????
???} case 3:
???{
????printf("您想更改的節(jié)點(diǎn)的同學(xué)的姓名為:");
????scanf("%s",name);
????upd(head,name);
????break;
???} case 4:
???{
????printf("您想查看的節(jié)點(diǎn)的同學(xué)姓名為:");
????scanf("%s",name);
????look(head,name);
????break;
???}
?
???case 5:
???{
????print(head);
????break;
???}
???case 6:
???{?
????exit(-1);
????break;
???}
????
???default:
???{?
????printf("輸入有誤,請(qǐng)您重新輸入!\n");
????break;
???} }
?}
}
注意:本程序用的是單鏈表實(shí)現(xiàn),而且函數(shù)調(diào)用我的傳參是是傳的head,子函數(shù)用的是STU*head接,這只是把創(chuàng)建的鏈表的首節(jié)點(diǎn)傳過去,當(dāng)插頭,刪頭后會(huì)對(duì)鏈表head節(jié)點(diǎn)做出改變,所以在主函數(shù)我用head=函數(shù)就沒問題了,如果你不想用head=函數(shù)來接,而直接返回函數(shù),可以將&head傳過去就可以了,如果需要這個(gè)版本的留言我可以發(fā)一份。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NULL 0
#define LEN sizeof(struct student)
typedef struct student
{
?long num;
?char name[30];
?char addr[30];
?char tel[30];
?struct student * next;
}
?STU; ? ? ? ? ? ? ? ? ? ? ?? //創(chuàng)建一個(gè)結(jié)構(gòu)體類型,鏈表元素模板,并用STU代表本結(jié)構(gòu)體類型。
{
?printf("若您輸入完畢請(qǐng)?jiān)谙乱淮屋斎雽W(xué)號(hào)輸為0即可。\n")?;
?STU *p1,*p2,*head;
?int n=0;
?p1=p2=(STU*)malloc(LEN); ? ? ? ? //創(chuàng)建鏈表第一個(gè)元素。
?printf("請(qǐng)輸入該同學(xué)的學(xué)號(hào):\n");
?scanf("%d",&p1->num);
?printf("請(qǐng)輸入該同學(xué)的姓名:\n");
?? scanf("%s",p1->name);
?printf("請(qǐng)輸入該同學(xué)的住址:\n");
?scanf("%s",p1->addr);
?printf("請(qǐng)輸入該同學(xué)的電話:\n");
?scanf("%s",p1->tel);?
?while(p1->num!=0)
?{
??n++;
??if(n==1)
? ? ? head=p1;
??p1=(STU*)malloc(LEN); ? ? ? ? ? //創(chuàng)建下一個(gè)是否要接入鏈表的元素。
??printf("請(qǐng)輸入該同學(xué)的學(xué)號(hào):\n");
??scanf("%d",&p1->num);
??printf("請(qǐng)輸入該同學(xué)的姓名:\n");
?? ?scanf("%s",p1->name);
??printf("請(qǐng)輸入該同學(xué)的住址:\n");
??scanf("%s",p1->addr);
??printf("請(qǐng)輸入該同學(xué)的電話:\n");
??scanf("%s",p1->tel);?
? p2->next=p1; p2=p1; } p2->next=NULL;
?return head;
}
STU *add(STU *head,long index)?????? // 增添新成員。
{
?STU *p1,*p2,*p3;
?p3=(STU *)malloc(LEN);
?printf("請(qǐng)輸入要插入的同學(xué)的學(xué)號(hào):\n");
?scanf("%d",&p3->num);
?printf("請(qǐng)輸入要插入的同學(xué)的姓名:\n");
?? scanf("%s",p3->name);
?printf("請(qǐng)輸入要插入的同學(xué)的住址:\n");
?scanf("%s",p3->addr);
?printf("請(qǐng)輸入要插入的同學(xué)的電話:\n");
?scanf("%s",p3->tel);?
?if(head==NULL)
?{
??printf("這是一個(gè)空鏈表!");
?}
?else
{
??p1=p2=head;
?while(p1->next!=NULL && p1->num!=index)
?{
??p2=p1;??
??p1=p1->next;
??
?}
?if(p1->num==index)
?{
??if(p1==head) ? ? //插頭。
??{
???head=p3;
???p3->next=p1;
??}
?
??else ? ? ? ? ? // 插中間
??{
???p2->next=p3;
???p3->next=p1;
??}
??
?}
?else ? ? ? ? //插尾。
?{
??p1->next=p3;
??p3->next=NULL; } }
?return head;
}
STU *del(STU *head,char name[30])?????? // 刪除某位成員。
{
?STU *p1,*p2;
?if(head == NULL.)
??{
???printf("這是一個(gè)空鏈表!\n"); }
?else
?{
??p1=head;
?while(p1->next != NULL && strcmp(p1->name,name)!=0)
?{
??p2=p1;
??p1=p1->next;
?}
?if(strcmp(p1->name,name)==0)
?{
??if(p1 == head)
??{
???head=p1->next;
???
??}
??else
??{
???p2->next=p1->next;
??}
?}
?else
?{
??printf("沒有您要?jiǎng)h除的同學(xué)!\n");
?}
?}
?
?return head;
}
STU *upd(STU *head,char name[30])??? //? 修改某位成員的信息。
{
?STU *p;
?if(head==NULL)
??{
???printf("這是一個(gè)空鏈表!\n"); }
?else
?{
??printf("%s\n",name);
??p=head;
??while(p->next!=NULL && strcmp(p->name,name)!=0)
??{
???p=p->next;
??}
??if(strcmp(p->name,name)==0)
??{
???printf("請(qǐng)輸入該同學(xué)更改后的學(xué)號(hào):\n");
???scanf("%d",&p->num);
???printf("請(qǐng)輸入該同學(xué)更改后的姓名:\n");
?? ??scanf("%s",p->name);
???printf("請(qǐng)輸入該同學(xué)更改后的住址:\n");
???scanf("%s",p->addr);
???printf("請(qǐng)輸入該同學(xué)更改后的電話:\n");
???scanf("%s",p->tel);?
??}
??else
??{
???printf("沒有您想要更改的同學(xué)信息\n");
??}
?}
?return head; }
STU *look(STU *head,char name[30])??? // 查看某位成員信息。
{
?STU *p;
?if(head==NULL)
??{
???printf("這是一個(gè)空鏈表!\n"); }
?else
?{
??p=head;
??while(p->next!=NULL && strcmp(p->name,name)!=0)
??{
???p=p->next;
??}
??if(strcmp(p->name,name)==0)
??{
???printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
??}
?else
??{
???printf("沒有您想要查看的同學(xué)信息\n");
??}
?}
?
}
void print(STU *head)???? //遍歷所有成員信息。
{
?STU *p;
?p=head;
?if(head!=NULL)
??do
???{
????printf("%d\t,%s\t,%s\t,%s\n",p->num,p->name,p->addr,p->tel);
????p=p->next;
???}
??while(p!=NULL);
}
int main()
{
?int a;
?long index;
?
? printf("************?? 歡迎來到........通訊錄!? **************************? \n ");
?printf("請(qǐng)您初始化您的鏈表:\n");
?STU *head;
?head=create();
?while(1)
?{
??char name[30];
??printf("請(qǐng)您輸入您想要的操作: 1:增加節(jié)點(diǎn); 2:刪除節(jié)點(diǎn); 3更新節(jié)點(diǎn); 4:查找節(jié)點(diǎn) ;? 5:輸出鏈表所以內(nèi)容? ;6 :退出。\n");
??scanf("%d",&a);
??switch(a)
??{
???case 1:
???{
????printf("您想將節(jié)點(diǎn)插在學(xué)號(hào)為多少的同學(xué)的前面:");
????scanf("%d",&index);?
????head=add(head,index);
????break;
???} case 2:
???{
????
????printf("您想刪除的節(jié)點(diǎn)的同學(xué)的姓名為:\n");
????scanf("%s",name);????
????head = del(head,name);
????break;
????
???} case 3:
???{
????printf("您想更改的節(jié)點(diǎn)的同學(xué)的姓名為:");
????scanf("%s",name);
????upd(head,name);
????break;
???} case 4:
???{
????printf("您想查看的節(jié)點(diǎn)的同學(xué)姓名為:");
????scanf("%s",name);
????look(head,name);
????break;
???}
?
???case 5:
???{
????print(head);
????break;
???}
???case 6:
???{?
????exit(-1);
????break;
???}
????
???default:
???{?
????printf("輸入有誤,請(qǐng)您重新輸入!\n");
????break;
???} }
?}
}
注意:本程序用的是單鏈表實(shí)現(xiàn),而且函數(shù)調(diào)用我的傳參是是傳的head,子函數(shù)用的是STU*head接,這只是把創(chuàng)建的鏈表的首節(jié)點(diǎn)傳過去,當(dāng)插頭,刪頭后會(huì)對(duì)鏈表head節(jié)點(diǎn)做出改變,所以在主函數(shù)我用head=函數(shù)就沒問題了,如果你不想用head=函數(shù)來接,而直接返回函數(shù),可以將&head傳過去就可以了,如果需要這個(gè)版本的留言我可以發(fā)一份。
總結(jié)
以上是生活随笔為你收集整理的用链表写的一个通讯录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html背景怎么变成透明的,怎样把图片背
- 下一篇: vsftpd 安装及简单配置