1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 typedef int ElemType ;
 5 
 6 typedef struct LNode{
 7     ElemType data;
 8     struct LNode *next;
 9 }LinkList;
10 
11 LinkList* CreateListF(LinkList *L,ElemType a[],int n){
12     LinkList *s;
13     int i;
14     L=(LinkList *)malloc(sizeof(LinkList));
15     L->next=NULL;//创建头结点,其next域置为NULL
16 
17     for(i=0;i<n;i++){
18         //循环建立数据节点
19         s=(LinkList *)malloc(sizeof(LinkList));
20         s->data=a[i];
21         s->next=L->next;
22         L->next=s;
23     }
24     return L;
25 }
26 
27 LinkList* CreateListR(LinkList *L,ElemType a[],int n){
28     LinkList *s,*r;
29     int i;
30     L=(LinkList *)malloc(sizeof(LinkList));
31     L->next=NULL;//创建头结点,其next域置为NULL
32     r=L;
33 
34     for(i=0;i<n;i++){
35         //循环建立数据节点
36         s=(LinkList *)malloc(sizeof(LinkList));
37         s->data=a[i];
38         r->next=s;
39         r=s;
40     }
41     r->next=NULL;
42     return L;
43 }
44 
45 void DestroyList(LinkList *L){
46     LinkList *pre=L,*p=L->next;//pre指向*p的前趋节点
47     while(p!=NULL){
48         //扫描单链表L
49         free(pre);
50         pre=p;//pre、p同步往后移动一个节点
51         p=pre->next;
52     }
53     free(pre);
54 }
55 
56 void DisplayList(LinkList *L){
57     LinkList *p=L->next;
58 
59     while(p!=NULL){
60         printf("%d ",p->data);
61         p=p->next;
62     }
63 }
64 int main()
65 {
66     int a[]={1,2,3,4,5};
67     LinkList *L;
68     //L=CreateListF(L,a,sizeof(a)/sizeof(int));
69     L=CreateListR(L,a,sizeof(a)/sizeof(int));
70     DisplayList(L);
71     return 0;
72 }

尾插法时的结果如下:

 

 头插法时的结果如下:

 

 综述:采用带头结点的头插法会使得数组元素顺序相反,而尾插法不变。