链表的基本操作

链表数据结构的定义:由于链表一方面需要在节点中存储数据,另一方面还需要存储"线索",因此,通常采用结构体定义链表节点数据类型。

 

 1 struct Node;
 2 typedef struct Node *PtrToNode;
 3 typedef PtrToNode List;
 4 typedef PtrToNode Position;
 5 typedef int ElementType;
 6 struct Node 
 7 {
 8     ElementType Element;
 9     Position Next;
10 };

基本操作:

 1 //创建链表
 2 List CreateList();
 3 //遍历链表
 4 void TraverseList(List L);
 5 //清空链表
 6 List MakeEmpty(List L);
 7 //判断给定列表是否为空
 8 int IsEmpty(List L);
 9 //判断节点在给定链表中是否为空
10 int IsLast(Position P, List L);
11 //在指定的链表中查找给定元素。
12 //存在则返回其第一次出现的位置,不存在则返回NULL
13 Position Find(ElementType X, List L);
14 //删除链表中的某个元素
15 void Delete(ElementType X, List L);
16 //在指定链表中查找给定元素的前驱节点
17 Position FindPrevious(ElementType X, List L);
18 //在链表给定位置的后面插入元素
19 void Insert(ElementType X, List L, Position P);
20 //删除链表
21 void DeleteList(List L);
22 //返回链表的头结点
23 Position Header(List L);
24 //返回链表第一个数据元素节点
25 Position First(List L);
26 //返回当前位置的下一个位置
27 Position Advance(Position P);
28 //获取当前位置元素的值
29 ElementType Retrive(Position P);

 

 实现:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 struct Node;
  5 typedef struct Node *PtrToNode;
  6 typedef PtrToNode List;
  7 typedef PtrToNode Position;
  8 typedef int ElementType;
  9 struct Node 
 10 {
 11     ElementType Element;
 12     Position Next;
 13 };
 14 
 15 //创建链表
 16 List CreateList();
 17 //遍历链表
 18 void TraverseList(List L);
 19 //清空链表
 20 List MakeEmpty(List L);
 21 //判断给定列表是否为空
 22 int IsEmpty(List L);
 23 //判断节点在给定链表中是否为空
 24 int IsLast(Position P, List L);
 25 //在指定的链表中查找给定元素。
 26 //存在则返回其第一次出现的位置,不存在则返回NULL
 27 Position Find(ElementType X, List L);
 28 //删除链表中的某个元素
 29 void Delete(ElementType X, List L);
 30 //在指定链表中查找给定元素的前驱节点
 31 Position FindPrevious(ElementType X, List L);
 32 //在链表给定位置的后面插入元素
 33 void Insert(ElementType X, List L, Position P);
 34 //删除链表
 35 void DeleteList(List L);
 36 //返回链表的头结点
 37 Position Header(List L);
 38 //返回链表第一个数据元素节点
 39 Position First(List L);
 40 //返回当前位置的下一个位置
 41 Position Advance(Position P);
 42 //获取当前位置元素的值
 43 ElementType Retrive(Position P);
 44 
 45 int IsEmpty(List L)
 46 {
 47     
 48     return L->Next == NULL;
 49 }
 50 
 51 int IsLast(Position P, List L)
 52 {
 53     return P->Next == NULL;
 54 }
 55 
 56 Position Find(ElementType X, List L)
 57 {
 58     Position P = L->Next;
 59     while(P != NULL && P->Element != X)
 60     {
 61         P = P->Next;
 62     }
 63     return P;
 64 }
 65 
 66 void Delete(ElementType X, List L)
 67 {
 68     Position P,TmpCell;
 69     P = FindPrevious(X,L);    
 70     if(!IsLast(P,L))
 71     {
 72         TmpCell = P->Next;
 73         P->Next = TmpCell->Next;
 74         free(TmpCell);
 75     }
 76 }
 77 
 78 Position FindPrevious(ElementType X, List L)
 79 {
 80     Position P = L;
 81     while(P->Next != NULL && P->Next->Element != X)
 82     {
 83         P = P->Next;
 84     }
 85     return P;
 86 }
 87 
 88 void Insert(ElementType X, List L, Position P)
 89 {
 90     Position TmpCell;
 91     TmpCell = malloc(sizeof(struct Node));
 92     if(TmpCell == NULL)
 93     {
 94         printf("Out of space!\n");
 95         return;
 96     }
 97     TmpCell->Element = X;
 98     TmpCell->Next = P->Next;
 99     P->Next = TmpCell;
100 }
101 
102 void DeleteList(List L)
103 {
104     Position P,Tmp;
105     P = L->Next;
106     L->Next = NULL;
107     while(P != NULL)
108     {
109         Tmp = P->Next;
110         free(P);
111         P = Tmp;
112     }
113 }
114 
115 Position Header(List L)
116 {
117     return L;
118 }
119 
120 Position First(List L)
121 {
122     return L->Next;
123 }
124 
125 Position Advance(Position P)
126 {
127     return P->Next;
128 }
129 
130 ElementType Retrive(Position P)
131 {
132     return P->Element;
133 }
134 
135 List CreateList()
136 {
137     int i;
138     Position P,Tmp;
139     List L = malloc(sizeof(struct Node));
140     P = L;
141     for(i = 0; i < 5; i++)
142     {
143         Tmp = malloc(sizeof(struct Node));
144         Tmp->Element = i;
145         P->Next = Tmp;
146         P = Tmp;        
147     }
148     P->Next = NULL;
149     return L;
150 }
151 
152 void TraverseList(List L)
153 {
154     Position P;
155     P = L->Next;
156     while(P != NULL)
157     {
158         printf("%d\n",P->Element);    
159         P = P->Next;
160     }
161 }
162 
163 int main(void)
164 {
165     //创建链表
166     List L = CreateList();
167     //查找元素1在链表中的位置
168     Position P = Find(1,L);
169     //在元素1后面插入元素8
170     Insert(8,L,P);
171     //查找元素8前驱结点
172     P = FindPrevious(8,L);
173     //遍历链表
174     TraverseList(L);
175     return 0;
176 }

 

 

原文链接

 

posted @ 2015-11-19 16:05  cp_cnblogs  阅读(259)  评论(0编辑  收藏  举报