1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef struct linklist
  5 {
  6     unsigned int count;
  7     struct linklist *next;
  8 }linklist;
  9 
 10 linklist* CreatLinklist(int len)
 11 {
 12     linklist *head = NULL, *pre = NULL;
 13     head = (linklist*)malloc(sizeof(linklist));//头指针。
 14     pre = (linklist*)malloc(sizeof(linklist)); //pre-previous, 前一个;相对于head来说是后一个。
 15     printf("Please input the data:\n");
 16     scanf("%u", &pre->count);
 17     head->next = pre; //head的后一个是pre。
 18     pre->next = NULL; //pre的next是NULL。
 19 
 20     for (int i = 1; i < len; i++)
 21     {
 22         linklist* tmp = (linklist*)malloc(sizeof(linklist));
 23         scanf("%u", &tmp->count);
 24         pre->next = tmp; //新加的节点放在pre后。
 25         tmp->next = NULL; //新加节点的next是NULL。
 26         pre = tmp; //新加的节点变成pre,等待下一个tmp。
 27     }
 28     return head;
 29 }
 30 
 31 int Outputlinklist(linklist *head)
 32 {
 33     printf("#### Output linklist.\n");
 34     if (head != NULL)
 35     {
 36         while (head->next != NULL)
 37         {
 38             printf("%u\n", head->next->count);
 39             head = head->next;
 40         }
 41     }
 42 }
 43 
 44 int Lenlinklist(linklist *head)
 45 {
 46     int len = 0;
 47     if (NULL == head->next)
 48         return len;
 49     len++;
 50     linklist *p = NULL;
 51     p = head->next;
 52     while(p->next != NULL)
 53     {
 54         len++;
 55         p = p->next;
 56     }
 57     return len;
 58 }
 59 
 60 int InsertLinklist(linklist *head, int index)
 61 {
 62     int len = 0;
 63     len = Lenlinklist(head);
 64     printf("the length of linklist:%d, the insert index:%d\n", len, index);
 65     if (index < 1 || index > len)
 66         return -1;
 67     int cur_index = 1;
 68     linklist *p = NULL;
 69     p = head->next;
 70     while(cur_index < index)
 71     {
 72         p = p->next;
 73         cur_index++;
 74     }
 75     linklist *node = (linklist*)malloc(sizeof(linklist));
 76     printf("Please input the new node data:\n");
 77     scanf("%u", &node->count);
 78     node->next = p->next;
 79     p->next = node;
 80     return 0;
 81 }
 82 
 83 int DeleteNode(linklist *head, int index)
 84 {
 85     int len = 0;
 86     len = Lenlinklist(head);
 87 
 88     if((index < 1) || (index > len))
 89         return -1;
 90 
 91     int cur_index = 1;
 92     linklist *p = NULL;
 93     linklist *q = NULL;
 94     p = head->next;
 95     while(cur_index < index)
 96     {
 97         p = p->next;
 98         cur_index++;
 99     }
100     q = p->next;
101     p->next = q->next;
102     free(q);
103     q = NULL;
104 }
105 
106 linklist *Reverselinklist(linklist *head)
107 {
108     linklist *p=NULL, *pre=NULL, *pnext=NULL;
109 
110     p = head->next;
111     while(p!=NULL)
112     {
113         pnext = p->next;
114         if(pnext == NULL)
115             head->next = p;
116         p->next = pre;
117         pre = p;
118         p = pnext;
119     }
120     return head;
121 }
122 
123 int main(void)
124 {
125     linklist *mylist = NULL;
126 
127     printf("#### Creat linklist.\n");
128     mylist = CreatLinklist(5);
129     Outputlinklist(mylist);
130 
131     printf("#### Insert new node.\n");
132     InsertLinklist(mylist, 2);
133     Outputlinklist(mylist);
134 
135     printf("#### Delete exist node.\n");
136     DeleteNode(mylist, 4);
137     Outputlinklist(mylist);
138 
139     printf("#### Reverse Linklist.\n");
140     Reverselinklist(mylist);
141     Outputlinklist(mylist);
142 
143     printf("Handle complete!");
144 }

1.线性表的链式存储和顺序存储的比较。

常见的数组就是线性表的顺序存储,各个结点之间被分配连续的物理内存,因此在查找上直接可以使用下标,速度很快,但是对于插入和删除操作需要在操作点之后执行移动操作,较为麻烦,并且数组在之前需要分配内存的大小,也就是需要我们知道结点的数量,这样就有一定的限制。
链表就是线性表的链式存储,各个结点之间在物理内存中是随机分配的,在查找时需要逐个遍历,但是在插入和删除操作时仅仅是局部性的指针切换,并且链表只有创建结点和删除结点时才会对内存进行操作,事先不需要知道结点数量。

2.单向链表属于线性表链式存储中最简单的一类,常见的操作包括:创建、删除、查找、插入、反序等。

 

posted on 2018-07-11 14:58  Garnett21  阅读(124)  评论(0编辑  收藏  举报