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