将字符存储到带有头结点的单向链表中

来源:互联网 发布:全国网络平台监管系统 编辑:程序博客网 时间:2024/05/18 00:54
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3.   
  4. struct node//定义结点结构体  
  5. {  
  6.     char ch;  
  7.     struct node *next;  
  8. };  
  9.   
  10. typedef struct node Node;//重命名 结点结构体变量  
  11. typedef struct node* Link;//重命名 指向结点结构体的指针变量  
  12.   
  13. int strlen_s(char *s)//求字符串长度  
  14. {  
  15.     int i = 0;  
  16.   
  17.     while (*s != '\n')  
  18.     {  
  19.         i++;  
  20.         s++;  
  21.     }  
  22.   
  23.     return i;  
  24. }  
  25.   
  26. void create_link(Link *head)//创建链表,  
  27. {  
  28.     *head = NULL;//空链表  
  29. }  
  30.   
  31. void is_malloc_ok(Link new_node)//判断新结点是否分配空间成功  
  32. {  
  33.     if (NULL == new_node)  
  34.     {  
  35.         printf("malloc error!\n");  
  36.         exit(-1);  
  37.     }  
  38. }  
  39.   
  40. void create_new_node(Link *new_node)//创建新结点  
  41. {  
  42.     *new_node = (Link)malloc(sizeof(Node));  
  43.     is_malloc_ok(*new_node);  
  44. }  
  45.   
  46. void insert_tail(Link *head, Link new_node)//尾插新结点  
  47. {  
  48.     Link tmp;  
  49.   
  50.     tmp = *head;  
  51.   
  52.     if (NULL == *head)//空链表,只能头插  
  53.     {  
  54.         new_node->next = *head;  
  55.         *head = new_node;  
  56.     }  
  57.     else  
  58.     {  
  59.         while (tmp->next != NULL)//找到尾结点  
  60.         {  
  61.             tmp = tmp->next;  
  62.         }  
  63.         tmp->next = new_node;  
  64.         new_node->next = NULL;  
  65.     }  
  66. }  
  67.   
  68. void display_link(Link head)//显示结点内容  
  69. {  
  70.     Link tmp;  
  71.     tmp = head;  
  72.   
  73.     if (NULL == head)//空链表  
  74.     {  
  75.         printf("Link is empty!\n");  
  76.         return ;  
  77.     }  
  78.   
  79.     while (tmp != NULL)  
  80.     {  
  81.         printf("ch is '%c'\n",tmp->ch);  
  82.         tmp = tmp->next;  
  83.     }  
  84.   
  85. }  
  86.   
  87. void makeEmpty(Link *head)//清空链表,释放结点空间  
  88. {  
  89.     Link tmp;  
  90.   
  91.     tmp = *head;  
  92.   
  93.     while(tmp != NULL)  
  94.     {  
  95.         *head = tmp->next;  
  96.         free(tmp);  
  97.         tmp = tmp->next;  
  98.     }  
  99. }  
  100.   
  101. int main()  
  102. {  
  103.     Link head = NULL;  
  104.     Link new_node = NULL;  
  105.     int i;  
  106.     int len;  
  107.     char s[20];  
  108.   
  109.     printf("Enter string(<=20)!\n");  
  110.     fgets(s,20,stdin);  
  111.   
  112.     len = strlen_s(s);  
  113.   
  114.     create_link(&head);//创建链表  
  115.   
  116.     for (i = 0; i < len; i++)  
  117.     {  
  118.         create_new_node(&new_node);//创建新结点  
  119.         new_node->ch = s[i];//为新结点成员赋值  
  120.         insert_tail(&head, new_node);//尾插新结点  
  121.     }  
  122.   
  123.     display_link(head);//显示链表  
  124.   
  125.     makeEmpty(&head);//清空链表,释放空间  
  126.   
  127.     display_link(head);//显示链表  
  128.   
  129.     return 0;  
  130. }
0 0