链表的简单操作

本程序首先利用主函数设计菜单选择界面,主函数中根据用户选择项转入相应功能函数,如果输入错误,主函数给出相应提示。其中用到变量j=1控制其循环运行。

程序运行后的功能有:
(1)菜单选择界面
(2)建立通讯录记录
(3)插入联系人记录
(4)查找联系人记录(名称和编号查询)
(6)删除联系人记录(按要求仅删除Head->next)
(7)输出所有联系人记录
(8)退出程序

  1. #include<stdio.h>    
  2. #include "string.h"   
  3. #include "stdlib.h"   
  4. typedef struct {  /*通讯录结点类型*/  
  5.     char num[5];   /*编号*/  
  6.     char name[9];  /*姓名*/  
  7.     char sex[3];    /*性别*/  
  8.     char phone[13]; /*电话*/  
  9.     char addr[31];  /*地址*/  
  10. } DataType;   
  11. typedef struct node {   /*结点类型定义*/  
  12.     DataType data;    /*结点数据域*/  
  13.     struct node* next;  /*结点指针域*/  
  14. } ListNode;   
  15. typedef ListNode* LinkList;   
  16. LinkList head;   
  17. ListNode* p;   
  18. LinkList CreateList(void);   
  19. void InsertNode(LinkList head, ListNode* p);   
  20. ListNode* ListFind(LinkList head);   
  21. void DelNode(LinkList head);   
  22. void PrintList(LinkList head);   
  23. /*******尾插法建立带头结点的通讯录链表算法*******/  
  24. LinkList CreateList(void)   
  25. {   
  26.     LinkList head = (ListNode*)malloc(sizeof(ListNode));  /*申请头结点*/  
  27.     ListNode* p, * rear;   
  28.     char flag='y';  //int flag=0;   /*结束标志置0*/   
  29.     rear = head;  /*尾指针初始指向头结点*/  
  30.     while (flag=='y')   
  31.     {   
  32.         p = (ListNode*)malloc(sizeof(ListNode));    /*申新结点*/  
  33.         printf("编号    姓名    性别   电话     地址 \n");   
  34.         printf("-----------------------------------------------\n");   
  35.         printf("\n添加的编号:\n");   
  36.         scanf("%s", p->data.num);   
  37.         printf("\n添加的姓名:\n");   
  38.         scanf("%s", p->data.name);   
  39.         printf("\n性别:\n");   
  40.         scanf("%s", p->data.sex);   
  41.         printf("\n电话:\n");   
  42.         scanf("%s", p->data.phone);   
  43.         printf("\n地址:\n");   
  44.         scanf("%s", p->data.addr);   
  45.         rear->next = p;        /*新结点连接到尾结点之后*/  
  46.         rear = p;             /*尾指针指向新结点*/  
  47.         printf("继续建表?(y/n):");   
  48.         getchar();   
  49.         scanf("%c", &flag);   
  50.     }   
  51.     rear->next = NULL;       /*终端结点指针置空*/  
  52.     return head;            /*返回链表头指针*/  
  53. }   
  54. /*********在通讯录链表head中插入结点************/  
  55. void InsertNode(LinkList head, ListNode* p)   
  56. {   
  57.     p->next = head->next;   
  58.     head->next = p;   
  59. }   
  60. /**********有序通讯录链表的查找 ****************/  
  61. ListNode* ListFind(LinkList head)   
  62. {   
  63.     ListNode* p;   
  64.     char num[5];   
  65.     char name[9];   
  66.     char pp;   
  67.     printf("==================\n");   
  68.     printf("  a. 按编号查询     \n");   
  69.     printf("  b. 按姓名查询     \n");   
  70.     printf("==================\n");   
  71.     printf("     请 选 择:     ");   
  72.     p = head->next;   
  73.     scanf("%c", &pp);   
  74.     if (pp == 'a' || pp == 'A')   
  75.     {   
  76.         printf("请输入要查找者的编号:");   
  77.         scanf("%s", num);   
  78.         while (p && strcmp(p->data.num, num) != 0)  p = p->next;   
  79.     }   
  80.     else if (pp == 'b' || pp == 'B') {   
  81.         printf(" 请输入要查找者的姓名:");   
  82.         scanf("%s", name);   
  83.         while (p && strcmp(p->data.name, name) != 0) p = p->next;   
  84.     }   
  85.     else  
  86.         p = NULL;   
  87.     return p;   
  88. }   
  89. /********通讯录链表上的结点删除*****************/  
  90. void DelNode(LinkList head)   
  91. {   
  92.     LinkList temp = head->next;   
  93.     head->next = head->next->next;   
  94.     free(temp);   
  95. }   
  96. /********通讯录链表的输出函数 **********/  
  97. void PrintList(LinkList head)   
  98. {   
  99.     LinkList temp = head->next;   
  100.     while (temp != NULL)   
  101.     {   
  102.         printf("地址%s,名字%s,数字%s,电话%s,性别%s\n", temp->data.addr, temp->data.name, temp->data.num, temp->data.phone, temp->data.sex);   
  103.         temp = temp->next;   
  104.     }   
  105. }   
  106. ListNode* Creatnode() {   
  107.     LinkList p = (ListNode*)malloc(sizeof(ListNode));  /*申请头结点*/  
  108.     printf("编号    姓名    性别   电话     地址 \n");   
  109.     printf("-----------------------------------------------\n");   
  110.     printf("\n添加的编号:\n");   
  111.     scanf("%s", p->data.num);   
  112.     printf("\n添加的姓名:\n");   
  113.     scanf("%s", p->data.name);   
  114.     printf("\n性别:\n");   
  115.     scanf("%s", p->data.sex);   
  116.     printf("\n电话:\n");   
  117.     scanf("%s", p->data.phone);   
  118.     printf("\n地址:\n");   
  119.     scanf("%s", p->data.addr);   
  120.     return p;   
  121. }   
  122. int main()   
  123. {   
  124.     int choice, j = 1;   
  125.     while (j)   
  126.     {   
  127.         printf("\n\n\n\n\n");   
  128.         printf("\t\t\t\t通 信 录 链 表 \n");   
  129.         printf("\n\t\t\t******************************");   
  130.         printf("\n\t\t\t*   1.通讯录链表的建立     *");   
  131.         printf("\n\t\t\t*   2.通讯者结点的插入     *");   
  132.         printf("\n\t\t\t*   3.通讯者结点的查询     *");   
  133.         printf("\n\t\t\t*   4.通讯者结点的删除     *");   
  134.         printf("\n\t\t\t*   5.通讯录链表的输出     *");   
  135.         printf("\n\t\t\t*   0.退出通讯录管理系统   *");   
  136.         printf("\n\t\t\t******************************");   
  137.         printf("\n\t\t\t请选择菜单号(0--5):");   
  138.         scanf("%d", &choice);   
  139.         getchar();   
  140.         switch (choice)   
  141.         {   
  142.         case 1:   
  143.         {   
  144.             head = CreateList();   
  145.             break;   
  146.         }   
  147.         case 2:   
  148.         {   
  149.             InsertNode(head, Creatnode());   
  150.             break;   
  151.         }   
  152.         case 3:   
  153.         {   
  154.             LinkList temp = ListFind(head);   
  155.             if(temp!=NULL)   
  156.                 printf("地址%s,名字%s,数字%s,电话%s,性别%s\n", temp->data.addr, temp->data.name, temp->data.num, temp->data.phone, temp->data.sex);   
  157.             break;   
  158.         }   
  159.         case 4:   
  160.         {   
  161.             DelNode(head);   
  162.             break;   
  163.         }   
  164.         case 5:   
  165.         {   
  166.             PrintList(head);   
  167.             break;   
  168.         }   
  169.         case 0:   
  170.         default:   
  171.             return 0;   
  172.         }   
  173.     }   
  174. }   
  175.   
 如未特殊声明,文章均为原创。
 本文标题:链表的简单操作
 本文链接:https://manwish.cn/article/basicnode.html

《链表的简单操作》有1条留言

留下评论