单链表增加头结点

方便插入、删除操作

注意与单链表的代码区别,尤其是细节部分

2.    #include <stdio.h>  
3.    #include <stdlib.h>  
4.    //定义带头结点的单链表   
5.    typedef int ElemType;  
6.    typedef struct node  
7.    {  
8.        ElemType elem;  
9.        struct node *next;  
10.    }Node;  
11.    typedef struct headerList  
12.    {  
13.        Node *header;  
14.        int n;  
15.    }HeaderList;  
16.    //初始化操作  
17.    int Init(headerList *L)  
18.    {  
19.        L->header = (Node*)malloc(sizeof(Node));  
20.        if(!L->header)       //表示必须有头结点   
21.            return 0;  
22.        L->header->next = NULL;  
23.        L->n = 0;  
24.        return 1;  
25.    }   
26.    //查找操作  
27.    //查找链表L中下标为i的元素,并赋值给x   
28.    int Find(headerList L,int i,ElemType *x)   
29.    {  
30.        int j;  
31.        Node *p;  
32.        if(i<0 || i> L.n-1)  
33.            return 0;  
34.        if(!L.n)  
35.            return 0;  
36.        p = L.header;  
37.        for(j=0;j<i;j++)  
38.            p = p->next;  
39.        *x = p->elem;  
40.        return 1;         
41.    }  
42.    //插入操作  
43.    //在下标i之前插入元素x   
44.    int Insert(headerList *L,int i,ElemType x)  
45.    {  
46.        Node *p,*q;  //p指向i位置,q指向插入元素x  
47.        int j;  
48.        if (i<-1 || i>L->n-1)  
49.            return 0;  
50.        p = L->header;  
51.        for(j=0;j<=i;j++)  
52.            p = p->next;  
53.        q = (Node*)malloc(sizeof(Node));  
54.        q->elem = x;  
55.        q->next = p->next;  
56.        p->next = q;  
57.        L->n++;  
58.        return 1;  
59.    }  
60.    //在下标i的元素x   
61.    int Delete(headerList *L,int i)  
62.    {  
63.        Node *p,*q;  //p指向i位置,q指向删除元素x  
64.        int j;  
65.        if (i<0 || i>L->n-1)  
66.            return 0;  
67.        if(!L->n)  
68.            return 0;  
69.        p = L->header;  
70.        for(j=0;j<i;j++)  
71.            p = p->next;  
72.        q = p->next;  
73.        p->next = q->next;  
74.        free(q);   
75.        L->n++;  
76.        return 1;  
77.    }  
78.    //输出操作    
79.    int Output(headerList *L)  
80.    {  
81.        Node *p;  
82.        p = L->header->next;  //注意头结点没有元素   
83.        if(!L->n)  
84.            return 0;  
85.        while(p)  
86.        {  
87.            printf("%d ",p->elem);  
88.            p = p->next;  
89.        }  
90.        printf("\n");  
91.        return 1;     
92.    }   
93.    void Destory(headerList *L)  
94.    {  
95.        Node *p;  
96.        while(L->header)  
97.        {  
98.            p = L->header->next;  
99.            free(L->header);  
100.            L->header = p;  
101.        }  
102.    }   
103.    int main(void)  
104.    {  
105.        int i,x;  
106.        Node *p;  
107.        headerList list;  
108.        Init(&list);  
109.        for(i=0;i<10;i++)  
110.            Insert(&list,i-1,i*2);  
111.        printf("执行插入操作之后的结果:\n");  
112.        Output(&list);  
113.        Find(list,2,&x);  
114.        printf("执行查找操作之后的结果:x=%d\n",x);   
115.        Delete(&list,2);  
116.        printf("执行插入操作之后的结果:\n");  
117.        Output(&list);  
118.        Destory(&list);  
119.        return 0;  
120.    }