线性表链式存储方式的C语言实现

  1 /*
  2   编译器:Dev-c++ 5.1.0 
  3   文件名:linkList3.cpp 
  4   代码版本号:1.0
  5    时间:2015年9月24日11:34:16
  6 */
  7 
  8 #include <stdio.h>
  9 #include <stdlib.h>
 10 #include <time.h>
 11 #define ERROR 0
 12 #define OK 1
 13 #define TRUE 1
 14 #define FALSE 0
 15 #define OVERFLOW -2
 16 
 17 typedef int Status;
 18 typedef int ElemType;
 19 
 20 typedef struct lNode{
 21 ElemType data;
 22 struct lNode *next;
 23 }lNode,*linkList;
 24 
 25 /*初始化建立空链表 ---测试成功*/
 26 Status initList(linkList *l){    
 27     *l=(linkList)malloc(sizeof(lNode)); //产生头结点,使L指向头结点 
 28     if(!*l){
 29         exit(OVERFLOW);
 30         return ERROR;
 31     }
 32     (*l)->next=NULL;
 33     return OK;
 34 }
 35 
 36 /*判定是否为空表 ---测试成功*/
 37 bool isEmpty(linkList l){
 38     if(l->next)
 39         return FALSE;
 40     return TRUE;
 41 } 
 42 
 43 /*清空链表 ---测试成功*/
 44 Status clearList(linkList *l){
 45     linkList p=(*l)->next;
 46     linkList q;
 47     while(!p)
 48     {
 49         q=p;
 50         free(q);
 51         p=p->next;
 52     }
 53     (*l)->next=NULL;//头结点指针域为空 
 54     return OK;
 55 } 
 56 
 57 /*返回L中数据元素个数 ---测试成功*/
 58 int listLength(linkList l){
 59     int i=0;
 60     linkList p=l->next;
 61     while(p){
 62         //printf("listLength()函数while语句
") ;
 63         i++;//i=1 
 64         p=p->next;
 65     }
 66     return i;
 67 }
 68 
 69 /*用e返回L中第i个数据元素的值---测试成功*/
 70 Status getElem(linkList *l,int i,ElemType *e){
 71     linkList p=(*l)->next;
 72     int j=1;
 73     if(i<1||i>listLength(*l))
 74     {
 75         exit(OVERFLOW);
 76         return ERROR;
 77     }
 78     
 79     while(p&&j!=i)
 80     {
 81         p=p->next;
 82         j++;
 83     }
 84     
 85     if(!p)
 86         return ERROR;
 87     
 88     *e=p->data;
 89     return OK;
 90 }
 91 
 92 /*返回L中第1个与e满足关系的数据元素的位序,若没有则返回0 ---测试成功 */ 
 93 int locateElem(linkList l,ElemType e){
 94     linkList p=l->next;
 95     int i=1;
 96     while(p&&p->data!=e)
 97     {
 98         p=p->next;
 99         i++;
100     }
101     if(!p)
102         return 0;
103     else
104         return i;
105 } 
106 
107 /*在L中第i个位置之前插入新的数据元素e,L的长度加1 ---测试成功*/
108 Status listInsert(linkList *l,int i,ElemType e){
109     
110     linkList p=(*l); //p=NULL;
111     linkList q;
112     int j=0;
113     
114     if(i<1||i>(listLength(*l)+1))
115     {
116         return ERROR;
117     }
118     while(p&&j<i-1) // 1<2
119     {
120         j++; //j=2
121         p=p->next;//p 第2个 
122     }
123 
124     q=(linkList)malloc(sizeof(lNode)); 
125     q->data=e; //q->data=5;
126     q->next=p->next;//q->next=NULL
127     p->next=q;//p->next=q
128     return OK;    
129 }
130 
131 /*删除L的第i个数据元素,并用e返回其值,L的长度减1 ---测试成功*/
132 Status deleteElem(linkList *l,int i,ElemType *e){
133      linkList p=(*l)->next;
134      int j=1;
135      if(i<1||i>listLength(*l))
136     {
137         return ERROR;
138     }
139     while(p&&j<i-1) //j指向第8个元素 
140     {
141         j++;
142         p=p->next;
143     } 
144     if(!p)
145         return ERROR;
146     else{
147         linkList q=p; //q指向第8个元素     
148         *e=q->next->data; //第9个元素的data赋给*e 
149         p->next=p->next->next;//第8个元素下一个是第10个元素 
150         free(q->next);
151         return OK;
152     }
153 } 
154 
155 /*依次对L的每个数据元素输出---测试成功 */
156 Status listTraverse(linkList *l){
157     linkList p=(*l)->next;
158     int j=1;
159     
160     while(p)
161     {
162         printf("第%d个结点的数据为%d
",j,p->data);
163         p=p->next;
164         j++;
165     }
166     return OK;
167     
168 }
169 
170 /*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)---测试成功*/ 
171 Status createListHead(linkList *l,int n)
172 {
173     srand(time(NULL));
174     linkList q;
175     for(int i=1;i<=n;i++){
176         q=(linkList)malloc(sizeof(lNode));
177         q->data=rand()%100+1;
178         q->next=(*l)->next;
179         (*l)->next=q;
180     }
181     return OK; 
182 }
183 
184 /*随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法)---测试成功*/ 
185 Status createListTail(linkList *l, int n)  
186 {
187     srand(time(NULL));
188     linkList q;
189     linkList tail=(*l);
190     for(int i=1;i<=n;i++){
191         q=(linkList)malloc(sizeof(lNode));
192         q->data=rand()%100+1;
193         q->next=NULL;
194         tail->next=q;
195         tail=tail->next;
196     }
197     return OK; 
198 }
199 
200 int main(){
201     ElemType e;//节点的数据data
202     linkList L;
203     initList(&L);
204     if(isEmpty(L))
205         printf("循环赋值前是空表
");
206     else
207         printf("循环赋值前不是空表
"); 
208     createListTail(&L,5);
209     
210     printf("链表长度为%d
",listLength(L));
211     listTraverse(&L);
212     int n;
213     printf("请输入要删除的元素位序:");
214     scanf("%d",&n);
215     deleteElem(&L,n,&e);
216     printf("删除第%d个元素的值为%d
",n,e);
217     printf("删除后链表的长度为%d",listLength(L));
218     return 0;
219 }
原文地址:https://www.cnblogs.com/gangtiexia/p/4834807.html