[C语言] 分享及讨论:链表操作(指针及指针的指针

[复制链接]
855|0
 楼主| mazhao141 发表于 2015-1-10 17:19 | 显示全部楼层 |阅读模式
link.h
  1. #ifndef _LINK_H_
  2. #define _LINK_H_

  3. #define ASCENDING 0
  4. #define DESCENDING 1

  5. #define UP 0
  6. #define DOWN 1


  7. typedef struct        NODE
  8. {
  9.         int value;
  10.         struct NODE *link;
  11. } Node;

  12. typedef struct
  13. {
  14.         unsigned num;
  15.         struct NODE *head_add;
  16. } Node_infoInit;

  17. void Create(Node_infoInit *Node_info_c);
  18. void list_print(Node_infoInit *Node_info);
  19. void list_sort(unsigned mode, Node_infoInit *Node_info);
  20. void list_insert(Node_infoInit *Node_info, int new_value);

  21. #endif
link.c:
  1. #include"link.h"
  2. #include<stdio.h>
  3. #include<stdlib.h>

  4. void Create(Node_infoInit *Node_info)
  5. {
  6.         unsigned i;
  7.         int        value_test;

  8.         Node *cnew , *cnew_temp , *head;

  9.         printf("please define the length of list\n");
  10.        
  11.         scanf("%d" , &Node_info->num);

  12.         if(Node_info->num != 0)
  13.         {
  14.                 printf("please input value to elements of list\n");
  15.                
  16.                 for(i = 0; i < Node_info->num; )
  17.                 {
  18.                         scanf("%d" , &value_test);

  19.                         if((value_test > 100) || (value_test < -100))
  20.                         {
  21.                                 printf("the value %d is out of limit , please input again\n", value_test);
  22.                         }
  23.                         else
  24.                         {
  25.                                 cnew_temp = (Node *)malloc(sizeof (Node));
  26.        
  27.                                 if(i == 0)
  28.                                 {
  29.                                         head = cnew_temp;
  30.                                         cnew = head;
  31.                                         head->value = value_test;
  32.                                         Node_info->head_add = head;
  33.                                 }
  34.                                 else
  35.                                 {
  36.                                         cnew->link = cnew_temp;
  37.                                         cnew  = cnew_temp;
  38.                                         cnew->value = value_test;       
  39.                                 }
  40.                                 i++;
  41.                                 cnew->link = NULL;
  42.                         }
  43.                 }

  44.         }
  45.         else
  46.         {
  47.                 Node_info->head_add = NULL;
  48.         }
  49.        
  50. }
  51. void list_print(Node_infoInit *Node_info)
  52. {
  53.         Node *list;
  54.         list = Node_info->head_add;

  55.         while(1)
  56.         {
  57.                 printf("%d\n", list->value);
  58.                 list = list->link;
  59.                 if(list->link == NULL)
  60.                 {
  61.                         printf("%d\n", list->value);
  62.                         break;
  63.                 }
  64.         }
  65. }
  66. void list_sort(unsigned mode, Node_infoInit *Node_info)
  67. {
  68.         Node *list;
  69.         int temp;
  70.         unsigned i, j;
  71.         list = Node_info->head_add;

  72.         if(mode == UP)
  73.         {
  74.                 printf("Sort by ascending\n");
  75.                 for(i = Node_info->num; i > 1; i--)
  76.                 {
  77.                         for(j = i; j > 1; j--)
  78.                         {
  79.                                 if(list->value < list->link->value)
  80.                                 {
  81.                                         temp = list->link->value;
  82.                                         list->link->value = list->value;
  83.                                         list->value = temp;
  84.                                 }
  85.                                 list = list->link;
  86.                         }
  87.                         list = Node_info->head_add;
  88.                 }
  89.         }
  90.         else
  91.         {
  92.                 printf("Sort by descending\n");
  93.                 for(i = Node_info->num; i > 1; i--)
  94.                 {
  95.                         for(j = i; j > 1; j--)
  96.                         {
  97.                                 if(list->value > list->link->value)
  98.                                 {
  99.                                         temp = list->link->value;
  100.                                         list->link->value = list->value;
  101.                                         list->value = temp;
  102.                                 }
  103.                                 list = list->link;
  104.                         }
  105.                         list = Node_info->head_add;
  106.                 }       
  107.         }
  108. }
  109. void list_insert(Node_infoInit *Node_info, int new_value)
  110. {
  111.         Node **linkp;
  112.         Node *list;
  113.         Node *cnew;

  114.         linkp = &Node_info->head_add;
  115.         while((list = *linkp) != NULL && list->value < new_value)
  116.                 linkp = &list->link;

  117.         cnew = (Node *)malloc(sizeof(Node));       
  118.         cnew->value = new_value;

  119.         cnew->link = list;
  120.         *linkp = cnew;

  121.         Node_info->num++;
  122. }
两个指向同一个地址的指针,还是指向一个地址的指针和指向这个指针的指针。这两个操作哪个靠谱?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

104

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部