13.1.22:带头结点的链表结构
1 /* 2 1.带头结点L的单链表结构 3 2.参照严慧敏单链表的链表结构 4 5 Levi 6 date:13.1.22 7 */ 8 9 #include <stdio.h> 10 #include "sys/malloc.h" 11 #include <stdlib.h> 12 #define ElemType int 13 14 15 struct LNode{ 16 ElemType data; 17 struct LNode * next; 18 }; 19 20 typedef struct LNode * LinkList; 21 22 void InitList(LinkList *L){ 23 *L=(LinkList)malloc(sizeof(struct LNode)); 24 if(!(*L)) 25 printf("Failed to allocate memory for L !!!"); 26 (*L)->next=NULL; 27 } 28 29 void DestroyList(LinkList *L){ 30 LinkList p; 31 while(*L){ 32 p=(*L)->next; 33 free(*L); 34 *L=p; 35 } 36 } 37 38 void ClearList(LinkList L){ 39 LinkList p,q; 40 p=L->next; 41 while(p){ 42 q=p->next; 43 free(p); 44 p=q; 45 } 46 L->next=NULL; 47 } 48 49 void ListEmpty(LinkList L){ 50 if(L->next) 51 printf("The LinkList is not NULL\n"); 52 else 53 printf("The LinkList is NULL\n"); 54 55 } 56 57 int ListLength(LinkList L){ 58 int i=1; 59 LinkList q; 60 q=L->next; 61 while(q->next){ 62 q=q->next; 63 ++i; 64 } 65 return i; 66 } 67 68 int GetElem(LinkList L,int i,ElemType *e){ 69 LinkList p; 70 p=L->next; 71 int count=1; 72 while(p&&count<i){ 73 p=p->next; 74 ++count; 75 } 76 if(!p||count>i){ 77 printf("The GetElem is failure !!!\n"); 78 return -1; 79 } 80 *e=p->data; 81 return 0; 82 } 83 84 int LocateElem(LinkList L,ElemType x){ 85 LinkList p; 86 p=L->next; 87 int count=1; 88 while(p->data!=x&&p){ 89 ++count; 90 p=p->next; 91 } 92 if(!p){ 93 printf("The linkList have not the Element .\n"); 94 return -1; 95 } 96 return count; 97 } 98 99 int ListInsert(LinkList L,int i,ElemType e){ 100 LinkList p; 101 p=L->next; 102 LinkList s=(LinkList)malloc(sizeof(struct LNode)); 103 if(!s){ 104 printf("S error!\n"); 105 return -1; 106 } 107 if(i==1){ 108 s->data=e; 109 s->next=p; 110 L->next=s; 111 return 0; 112 } 113 int count=1; 114 while(p&&count<i-1){ 115 p=p->next; 116 ++count; 117 } 118 if(!p||count>i-1){ 119 printf("Insert failure .\n"); 120 return -1; 121 } 122 s->data=e; 123 s->next=p->next; 124 p->next=s; 125 return 0; 126 } 127 128 int ListDelete(LinkList L,int i,ElemType *e){ 129 LinkList p,q; 130 p=L->next; 131 int count=1; 132 // if (i<1||i>ListLength(L)){ 133 // printf("i is error !\n"); 134 // return 0; 135 // } 136 if (i==1){ 137 L->next=p->next; 138 *e=p->data; 139 free(p); 140 return 0; 141 } 142 while(p&&count<i-1){ 143 p=p->next; 144 ++count; 145 } 146 if(!p||count>i-1){ 147 printf("Delete failure.\n"); 148 return 0; 149 } 150 q=p->next; 151 *e=q->data; 152 p->next=q->next; 153 free(q); 154 q=NULL; 155 return 0; 156 } 157 158 void print(ElemType c){ 159 printf("%d ",c); 160 } 161 162 void print(ElemType c); 163 void ListTraverse(LinkList L,void(* vi)(ElemType)){ 164 LinkList p=L->next; 165 while(p){ 166 vi(p->data); 167 p=p->next; 168 } 169 printf("\n"); 170 } 171 172 173 174 void CreateList(LinkList *L,int n){ 175 int i; 176 LinkList p; 177 *L=(LinkList)malloc(sizeof(struct LNode)); 178 (*L)->next=NULL; 179 printf("Please input Link_len = %d : \n",n); 180 for(i=n;i>0;--i){ 181 p=(LinkList)malloc(sizeof(struct LNode)); 182 scanf("%d",&p->data); 183 p->next=(*L)->next; 184 (*L)->next=p; 185 } 186 } 187 188 void CreateList1(LinkList *L,int n){ 189 int i; 190 LinkList p,q; 191 (*L)=(LinkList)malloc(sizeof(struct LNode)); 192 (*L)->next=NULL; 193 q=(*L); 194 printf("Please input Link_len = %d : \n",n); 195 for(i=n;i>0;--i){ 196 p=(LinkList)malloc(sizeof(struct LNode)); 197 scanf("%d",&p->data); 198 q->next=p; 199 q=q->next; 200 } 201 p->next=NULL; 202 } 203 204 void MergeList(LinkList La,LinkList Lb,LinkList *Lc){ 205 LinkList pa=La->next,pb=Lb->next,pc; 206 *(Lc)=pc=La; 207 while(pa&&pb){ 208 if(pa->data<=pb->data){ 209 pc->next=pa; 210 pc=pa; 211 pa=pa->next; 212 } 213 else{ 214 pc->next=pb; 215 pc=pb; 216 pb=pb->next; 217 } 218 pc->next=pa?pa:pb; 219 free(Lb); 220 Lb=NULL; 221 } 222 } 223 224 int main(){ 225 LinkList La,Lb,Lc; 226 227 InitList(&L); 228 int j; 229 for(j=1;j<=5;j++){ 230 ListInsert(L,1,j); 231 } 232 ListTraverse(L,print); 233 ListEmpty(L); 234 int e; 235 ListDelete(L,41,&e); 236 ListTraverse(L,print); 237 printf("%d\n",e); 238 printf("********\n"); 239 printf("%d\n",ListLength(L)); 240 ListEmpty(L); 241 242 printf("********\n"); 243 GetElem(L,4,&e); 244 printf("%d\n",e); 245 246 printf("********\n"); 247 int dis=LocateElem(L,2); 248 printf("%d",dis); 249 250 int n=5; 251 CreateList1(&La,n); 252 ListTraverse(La,print); 253 CreateList1(&Lb,n); 254 ListTraverse(Lb,print); 255 MergeList(La,Lb,&Lc); 256 ListTraverse(Lc,print); 257 258 scanf("%*s"); 259 260 return 0; 261 }