线性表链式存储方式的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语句\n") ; 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\n",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("循环赋值前是空表\n"); 206 else 207 printf("循环赋值前不是空表\n"); 208 createListTail(&L,5); 209 210 printf("链表长度为%d\n",listLength(L)); 211 listTraverse(&L); 212 int n; 213 printf("请输入要删除的元素位序:"); 214 scanf("%d",&n); 215 deleteElem(&L,n,&e); 216 printf("删除第%d个元素的值为%d\n",n,e); 217 printf("删除后链表的长度为%d",listLength(L)); 218 return 0; 219 }