鱼C论坛

 找回密码
 立即注册
查看: 2992|回复: 0

[技术交流] 单向链表,用函数实现各功能

[复制链接]
发表于 2020-2-20 14:26:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码如下,有不足的地方希望能提出在帖子下方
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>

  4. #define OBJECT char name[]
  5. #define null NULL
  6. #define IndexOutBounds(index) printf("不合法的索引位置:%d!\n", index)

  7. #define MALLOC (NODE *) malloc(sizeof(NODE))

  8. typedef struct node NODE;
  9. typedef struct node * NODEP;

  10. struct node{
  11.         char name[20];
  12.         NODE *p;
  13. };

  14. static int size = 0;
  15. static NODE *first = null;
  16. static NODE *last = null;
  17. static NODE nullNode = {"", null};

  18. NODEP getNode(OBJECT){
  19.         NODEP p = MALLOC;
  20.         int i = 0;
  21.         while((p -> name)[i++] = name[i]){}
  22.         p -> p = null;
  23.         return p;
  24. }

  25. void add(OBJECT){
  26.         NODEP node = getNode(name);
  27.         void toString();
  28.         size++;
  29.         if(!last){
  30.                 first = node;
  31.                 last = first;
  32.                 return;
  33.         }
  34.         last -> p = node;
  35.         last = last -> p;
  36. }

  37. void addFirst(OBJECT){
  38.         NODEP node = getNode(name);
  39.         void toString();
  40.         size++;
  41.         if(!first){
  42.                 first = node;
  43.                 last = first;
  44.                 return;
  45.         }
  46.         node -> p = first;
  47.         first = node;
  48. }

  49. void addTo(OBJECT, int index){
  50.         int checkIndex(int index);
  51.         NODEP get(int index);
  52.         NODEP temp;
  53.         NODEP node = getNode(name);
  54.         if(index == 0){
  55.                 addFirst(name);
  56.         }else if(index == size){
  57.                 add(name);
  58.         }else{
  59.                 if(checkIndex(index)){
  60.                         size++;
  61.                         temp = get(index - 1);// 查询出要插入位置的上一个节点
  62.                         node -> p = temp -> p;// 将新节点的下一节点改为上一节点的下一节点
  63.                         temp -> p = node;// 将上一节点的下一节点改为新节点
  64.                 }
  65.         }
  66. }

  67. int empty(){
  68.         return size == 0;
  69. }

  70. // 检查索引是否合法
  71. int checkIndex(int index){
  72.         if(index < 0 || index >= size){
  73.                 IndexOutBounds(index);
  74.                 return 0;
  75.         }
  76.         return 1;
  77. }

  78. NODEP get(int index){
  79.         int i = 0;
  80.         NODEP node = null;
  81.         // 判断索引是否越界
  82.         if(checkIndex(index)){
  83.                 node = first;
  84.                 for(; i < size - 1; i++){
  85.                         if(i == index){
  86.                                 return node;
  87.                         }
  88.                         node = node -> p;
  89.                 }
  90.         }
  91.         return node;
  92. }

  93. void removeFirst(){
  94.         NODEP p = first;
  95.         size--;
  96.         if(size == 1){
  97.                 first = null;
  98.                 last = null;
  99.                 free(p);
  100.                 return;
  101.         }
  102.         first = first -> p;
  103.         free(p);
  104. }

  105. void removeLast(){
  106.         NODEP temp;
  107.         NODEP p = last;
  108.         size--;
  109.         if(size == 1){
  110.                 first = null;
  111.                 last = null;
  112.                 free(p);
  113.                 return;
  114.         }
  115.         temp = get(size - 2);
  116.         temp -> p = null;
  117.         last = temp;
  118.         free(p);
  119. }

  120. void removeNode(int index){
  121.         NODEP temp;
  122.         if(checkIndex(index)){
  123.                 if(index == 0){
  124.                         removeFirst();
  125.                 }else if(index == size - 1){
  126.                         removeLast();
  127.                 }else{
  128.                         NODEP p;
  129.                         size--;
  130.                         temp = get(index - 1);
  131.                         p = temp -> p;
  132.                         temp -> p = temp -> p -> p;
  133.                         free(p);
  134.                 }
  135.         }
  136. }

  137. void toString(){
  138.         if(size == 0){
  139.                 printf("[]\n");
  140.                 return;
  141.         }
  142.         {
  143.                 NODEP node = first;
  144.                 char string[2000] = "[";
  145.                 strcat(string, node -> name);
  146.                 while(node -> p){
  147.                         node = node -> p;
  148.                         strcat(string, ",");
  149.                         strcat(string, node -> name);
  150.                 }
  151.                 strcat(string, "]");
  152.                 printf("%s\n", string);
  153.         }
  154. }

  155. void main(){
  156.         int i;
  157.         char name[20];
  158.         while(i != 5){
  159.                 printf("----------------------------------------\n1.添加\n2.删除\n3.查询\n4.展示\n5.退出\n");
  160.                 scanf("%d", &i);
  161.                 if(i < 1 || i > 5){
  162.                         i = 1;
  163.                 }
  164.                 switch(i){
  165.                 case 1 : {
  166.                                         printf("1.最前面\n2.最后面\n3.指定位置\n");
  167.                                         scanf("%d", &i);
  168.                                         printf("请输入姓名:\n");
  169.                                         scanf("%s", &name);
  170.                                         if(i == 1){
  171.                                                 addFirst(name);
  172.                                         }else if(i == 2){
  173.                                                 add(name);
  174.                                         }else{
  175.                                                 printf("输入要插入的位置:\n");
  176.                                                 scanf("%d", &i);
  177.                                                 addTo(name, i);
  178.                                         }
  179.                                         break;
  180.                                  };
  181.                 case 2 : {
  182.                                         printf("输入要删除的位置:\n");
  183.                                         scanf("%d", &i);
  184.                                         removeNode(i);
  185.                                         break;
  186.                                  };
  187.                 case 3 : {
  188.                                         printf("输入要查询的位置:\n");
  189.                                         scanf("%d", &i);
  190.                                         printf("%s\n", get(i) -> name);
  191.                                         break;
  192.                                  };
  193.                 case 4 : {
  194.                                         toString();
  195.                                         break;
  196.                                  };
  197.                 case 5 : goto end;
  198.                 }
  199.         }
  200. end:;
  201. }
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
qiuyouzhi + 3 + 3 先鼓励一哈~~~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 08:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表