用链表写的通讯录

来源:互联网 发布:java中set集合 编辑:程序博客网 时间:2024/06/03 15:18
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN sizeof(STU)
typedef struct student
    {
        char name[12];
int i;
        char tel[11];
        struct student  *next;
    }STU;
STU *create()
{
STU *p1,*p2,*head;
int n=0;
head=NULL;
p1=p2=(STU *)malloc(LEN);
printf("请输入序号\n");
scanf("%d",&p1->i);
printf("请输入姓名\n");
scanf("%s",p1->name);
printf("请输入号码\n");
scanf("%s",p1->tel);
while(p1->i!=0)
{
n++;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(STU *)malloc(LEN);
printf("请输入序号\n");
scanf("%d",&p1->i);
printf("请输入姓名\n");
scanf("%s",p1->name);
printf("请输入号码\n");
scanf("%s",p1->tel);

}
p2->next=NULL;
return head;
}
STU* add(STU* head,int index,char name[12],char tel[11])
{
printf("增加节点\n");
STU *p1,*p2,*p3;
if(head==NULL)
{
printf("这个列表是空的\n");
}
else
{
p1=p2=head;
while(p1->next!=NULL&&p1->i!=index)
{
p1=p1->next;
p2=p1;
}
if(p1->i==index)
{
p3=(STU*)malloc(LEN);
strcpy(p3->name,name);
strcpy(p3->tel,tel);
p3->i=index+1;
if(p2->next==NULL)
{
p2->next=p3;
p3->next=NULL;
}
else 
{
p3->next=p2->next;
p2->next=p3;
}
while(p1->next!=NULL)
{
p1->i++;
p1=p1->next;
}
}
else
printf("找不到此节点\n");

}




return head;






}
STU* delate(char name[12],STU *head)
{
STU *p1,*p2;
p2=head;
p1=p2;
STU *d;
while(p1->next!=NULL)
{  
if(strcmp(p2->name,name)==0)
{
if(p2==head){
head=p2->next;
}
else 
p1->next=p2->next;
d=p2;
p2->next->i--;
printf("删除节点成功\n");
}
else 
p1=p2;

p2=p2->next;
}
free(d);
    return head;
}
STU *scr(char name[12],STU *head)
{
STU *p1,*p2;
p1=head;
while(head->next!=NULL)
{

if(strcmp(p1->name,name)==0)
{
break;
}
p1=p1->next;
}
if(head->next!=NULL)
{
printf("找到了\n");
printf("%s\n%s\n",p1->name,p1->tel);
}
else
printf("查无此人\n");
}
STU *update(STU*head,int index,char name[12],char tel[11])
{
printf("更新\n");
STU *p;
if(head==NULL)
{
printf("这是个假链表\n");
}
else
{
p=head;
while(p->next!=NULL&&p->i!=index)
{
p=p->next;
}
if(p->i==index)
{
strcpy(p->name,name);
strcpy(p->tel,tel);
printf("更新成功\n");
}
else
printf("找不到你要更改的节点\n");
}
return head;
}
void printlist(STU *head)
{
STU *p;
p=head;
if(head!=NULL)
{
do
{
printf("姓名:%s 号码:%s\n",p->name,p->tel);
p=p->next;
}while(p!=NULL);
}
}
int main(int argc, char **argv)
{
printf("欢迎来到154班通讯录\n");
struct student *head;
int index=0;
char name[12]=" ";
char tel[11]=" ";
char hs;
head=create();
printf("请输入你想要进行的操作\n");
printf(" a 增加节点 d 删除节点 s 查找节点 u 更改节点\n");
while(1)
{

scanf("%c",&hs);
switch(hs)
{
case 'a':{
printf("输入你想要插入第几行\n");
scanf("%d",&index);
printf("输入你想要插入人的姓名\n");
scanf("%s",name);
printf("输入你想要插入人的号码\n");
scanf("%s",tel);
add(head,index,name,tel);
break;}
case 'p':{printlist(head);break;}
case 'd':{
printf("输入你想要删除人的姓名\n");
scanf("%s",name);
head =delate(name,head);

break;}
case 'u':{
printf("输入你想要更改第几行\n");
scanf("%d",&index);
printf("输入你想要更改人的姓名\n");
scanf("%s",name);
printf("输入你想要更改人的号码\n");
scanf("%s",tel);
update(head,index,name,tel);
break;}
case 's':{
printf("输入你想要查询人的姓名\n");
scanf("%s",name);
scr(name,head);
break;}
//default:   printf("不");break;
}
}
   return 0;
}