链表写的通讯录

这个博客介绍了一个使用C语言实现的基于双向循环链表的通讯录管理系统。系统包括添加、删除、查询、修改联系人等功能,并提供了一个简单的用户交互菜单。通过链表数据结构,实现了对联系人信息的高效操作。
摘要由CSDN通过智能技术生成

双向循环链表写的通讯录。请多多指教!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

struct node
{
 int id;
 char name[20];
 char phone[11];
 char addr[30];
 struct node *next,*prior;
};

typedef struct node Node;
typedef struct node *Link;

void creat_link(Link *head);
void creat_node(Link *newnode,Link *head);
void insert_head_node(Link newnode,Link *head);
int del_node_id(int id,Link *head);
void id_valuation(Link *head);
int del_node_name(char *name,Link *head);
void again_add(Link *head);
void add(Link *head);
void select_people(char *name,Link *head);
void my_select(Link *head);
void display(Link *head);
void del(Link *head);
void mod(Link *head);
void menu(Link *head);


//创建链表
void creat_link(Link *head)
{
 *head = (Link)malloc(sizeof(Node));
 if(!(*head))
 {
  printf("malloc error!\n");
  exit(-1);
 }
    (*head)->next = *head;
 (*head)->prior = *head;
}

//创建节点
void creat_node(Link *newnode,Link *head)
{
 Link p = (*head)->next;
 *newnode = (Link)malloc(sizeof(Node));
 if(!(*newnode))
 {
  printf("malloc error!\n");
  exit(-1);
 }
 else
 {
  (*newnode)->next = p->next;
     p->next->prior = *newnode;
     (*newnode)->prior = p;
     p->next = *newnode;
 }
}


//头插
void insert_head_node(Link newnode, Link *head)
{
 newnode -> next =(*head) -> next;
 (*head) -> next->prior = newnode;
 newnode->prior = *head;
 (*head) ->next = newnode;
}


//创建姓名结点
int del_node_name(char *name,Link *head)
{
 Link p = (*head)->next;
 while(p != (*head))
 {
  if(strcmp(p->name,name) == 0)
  {
   p->prior->next = p->next;
   p->next->prior = p->prior;
   free(p);
   p = NULL;
   return  0;
  }
  p = p->next;
 }
 return -1; 
}


int del_node_id(int id,Link *head)
{
 Link p = (*head)->next;
 while(p != (*head))
 {
  if(p->id == id);
  {
   p->prior->next = p->next;
   p->next->prior = p->prior;
   free(p);
   p = NULL;
   return  0;
  }
  p = p->next;
 }
 return -1; 
}

void id_valuation(Link *head)
{
 int del_node_id(int id,Link *head);
    int i = 0;
 Link p = (*head)->next;
 while(p != (*head))
 {
  p -> id = ++i;
  p = p->next;
    }
}

void again_add(Link *head)
{
 char symbol;
 getchar();
 printf("\n是否继续添加好友? Y/N\n");
 scanf("%c",&symbol);
 if(symbol == 'y')
 {
  add(head);
 }
 return ;
}

//添加联系人
void add(Link *head)

 void again_add(Link *head);
 system("clear");
 Link p;
 Link q = (*head)->next;
 p = (Link)malloc(sizeof(Node));
 printf("联系人姓名: ");
 scanf("%s",p->name);
 printf("手机号码: ");
 scanf("%s",p->phone);
 printf("家庭住址: ");
 scanf("%s",p->addr);
 if(q->next == *head)
 {
  insert_head_node(p,head);
  id_valuation(head);
  printf("添加成功!\n"); 
  again_add(head);
  return ;
 }
 q = q->next;
 if(q->prior == *head && strcmp(p->name,q->name) < 0)
 {
  insert_head_node(p,&(q->prior));
  id_valuation(head);
  printf("添加成功!\n"); 
  again_add(head);
  return;
 }
 q = q->next;
 while(q != *head) 
 {
  if(strcmp(p->name,q->prior->name) > 0 && strcmp(p->name,q->name) <= 0)
  {
   insert_head_node(p,&(q->prior));
   id_valuation(head);
   printf("添加成功!\n"); 
   again_add(head);
   return ;
  }
  q = q->next;
 }
 insert_head_node(p,&(q->prior));
 id_valuation(head);
 printf("添加成功!\n"); 
 again_add(head);
 return ; 
}


//查询联系人
void select_people(char *name,Link *head)
{
 int flag = 0;
 Link p = (*head)->next;
 while(p != (*head))
 {
  if(strcmp(p->name,name) == 0)
  {
   flag = 1;
   printf("ID:       %d\n",p->id);
   printf("姓名:     %s\n",p->name);
   printf("手机号码: %s\n",p->phone);
   printf("家庭住址: %s\n",p->addr);
  }
  p = p->next;
 }
 if(0 == flag)
 {
  printf("\n没有该联系人!!");
 }
}

void my_select(Link *head)
{
 system("clear");
 char name[20];
 printf("输入要查找人姓名: ");
 scanf("%s",name);
 select_people(name,head);
 printf("\n");
}

//显示联系人
void display(Link *head)
{
 system("clear");
 Link p = (*head)->next;
 if((*head)->next == (*head))
 {
  printf("empty!\n");
  return;
 }
 else
 {
  while(p != (*head))
  {
   printf("ID:       %d\n",p->id);
      printf("联系人姓名: %s\n",p->name);
      printf("手机号码: %s\n",p->phone);
      printf("家庭住址: %s\n",p->addr);
      p = p->next;
     }
 }
}


//删除联系人
void del(Link *head)
{
 int id;
 char name[20];
 int i = 0;
 Link p = (*head)->next;
 printf("输入要删除人的名字:\n");
 scanf("%s",name);
 while(p != (*head))
 {
  if(strcmp(p->name,name) == 0)
  {
   i++;
  }
  p = p->next;
 }
 if(0 == i)
 {
  printf("无此好友!");
  return;
 }
 if(1 == i)
 {
  del_node_name(name,head);
 }
 else
 {
  system("pause");
  printf("你要删除的人有以下几人:\n");
  select_people(name,head);
  printf("输入你要删除人的ID:");
  scanf("%d",&id);
  del_node_id(id,head);
 }
 printf("删除成功!");
 id_valuation(head);
 return;
}


//修改联系人
void mod(Link *head)
{
 char dest[20];
 Link p = (*head)->next;
 int id;
 int flag = 0;

 printf("输入要修改信息的联系人名字\n");
 scanf("%s",dest);
 while(p != (*head))
 {
  if(strcmp(p->name,dest) == 0)
  {
   flag = 1;
   printf("ID:       %d\n",p->id);
   printf("姓名:     %s\n",p->name);
   printf("手机号码: %s\n",p->phone);
   printf("家庭住址: %s\n",p->addr);
  }
  p = p->next;
 }
 if(flag == 0)
 {
  printf("\n没有此联系人!!\n");
  return ;
 }
 p = (*head)->next;
 printf("输入要修改联系人的ID:");
 scanf("%d",&id);
 while(p != (*head))
 {
  if( id == p->id )
  {
   printf("\n请做修改:\n");
   printf("手机号码: ");
   scanf("%s",p->phone);
   printf("家庭住址: ");
   scanf("%s",p->addr);
   return ;
  }
  p = p->next;
 }
}

 
void menu(Link *head)
{
 system("clear");
 int order;
 printf("\t\t\t+=================================================+\n");
 printf("\t\t\t|                                                 |\n");
 printf("\t\t\t|                                                 |\n");
 printf("\t\t\t|                多功能电子通讯录                 |\n");    
 printf("\t\t\t|                                                 |\n");
 printf("\t\t\t|                                        版本:1.0|\n");
 printf("\t\t\t|-------------------------------------------------|\n");
 printf("\t\t\t|      1:添加好友信息        2:查看好友信息       |\n");
 printf("\t\t\t|-------------------------------------------------|\n");
 printf("\t\t\t|      3:搜索好友信息        4:删除好友信息   |\n");
 printf("\t\t\t|-------------------------------------------------|\n");
 printf("\t\t\t|      5:修改好友信息        6:退出该通讯录       |\n");
 printf("\t\t\t+=================================================+\n");
 printf("\n\t\t\t            ★请输入需要的操作(1~5): ");

 scanf("%d",&order);
 switch(order)
 {
  case 1:
   {
    add(head);
    getchar();
    menu(head);
    break;
   }
  case 2:
   {
    display(head);
    getchar();
    getchar();
    menu(head);
    break;
   }
  case 3:
   {
    my_select(head);
    getchar();
    getchar();
    menu(head);
    break;
   }
  case 4:
   {
    del(head);
    getchar();
    getchar();
    menu(head);
    break;
   }
  case 5:
   {
    mod(head);
    getchar();
    getchar();
    menu(head);
    menu(head);
    break;
   }
  case 6:
   {
    exit(1);
    break;
   }
  default:
   {
    getchar();
    printf("\n\t\t\t\t!!此序号无对应功能,按任意键回到主菜单!!\n");
    getchar();
    getchar();
    getchar();
    menu(head);
   }
 }
}


int main()
{
 Link head;
 Link newnode;
 //Link newnode;
   
 creat_link(&head);
  //creat_node(&newnode,&head);
    menu(&head);
      //add(head);
  // display(head);
   // menu();
 //select(head);
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值