用链表写的一个通讯录

       链表是一种常见的重要的数据结构,其应用很广,要灵活使用链表就需要了解链表其中一些机制。本人在初略链表知识下完成了一个用链表实现的一个同学通讯录,他可以实现增,删,改 ,查,和遍历输出,经过本人亲自调试,可以运行成功。看懂本程序可以对链表的知识和应用有初步提升。希望能帮到大家。如果有什么不理解的地方可以留言,我会经 常回来看,力所能及说出本人写的思想和具体步骤的作用。当然觉得不足之处也欢迎提出,这样也可以方便我也可以提升自身水平。谢谢浏览!





#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代表本结构体类型。

 STU *create()          //创建链表。
{
 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传过去就可以了,如果需要这个版本的留言我可以发一份。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值