13.1.22:线性表之单链表
1 /* 2 1.不带头结点的单链表。 3 2.需要修改,有引用在里面,只是伪代码。 4 5 6 Levi. 7 date:2013.1.22 8 */ 9 10 #include <stdio.h> 11 #include "sys/malloc.h" 12 #include <stdlib.h> 13 14 typedef struct LNode{ 15 TypeElem data; 16 struct LNode *next; 17 }; 18 19 typedef struct LNode * LinkList; 20 21 void InitList(LinkList *L){ 22 *L=NULL; 23 } 24 25 void ClearList(LinkList *L){ 26 LinkList p; 27 while(L){ 28 p=L; 29 L=p->next; 30 free(p); 31 p=NULL; 32 } 33 } 34 35 void ListEmpty(LinkList L){ 36 if(L) 37 printf("The L is not NULL\n"); 38 else 39 printf("The L is NULL\n"); 40 41 } 42 43 int ListLength(LinkList L){ 44 LinkList p; 45 p=L; 46 int count=0; 47 while(p){ 48 p=p->next; 49 ++count; 50 } 51 return count; 52 } 53 54 int GetElem(LinkList L,int i,ElemType *e){ 55 LinkList p; 56 p=L; 57 int count=1; 58 while(p&&count<i){ 59 p=p->next; 60 ++count; 61 } 62 if(!p||count>i){ 63 printf("Get error !!\n"); 64 return 0; 65 } 66 p->data=*e; 67 return 0; 68 } 69 70 int LocateElem(LinkList L,ElemType e){ 71 int i=1; 72 LinkList p=L; 73 while(p&&p->data!=e){ 74 p=p->next; 75 i++; 76 } 77 if(!p) 78 return -1; 79 else 80 return i; 81 } 82 83 int ListInsert(LinkList &L,int i,ElemType e){ 84 int j=1; 85 LinkList s,p=L; 86 if(i<1) 87 return -1; 88 s=(LinkList)malloc(sizeof(struct LNode)); 89 s->data=e; 90 if(i==1){ 91 s->next=L; 92 L=s; 93 } 94 95 else{ 96 while(p&&j<i-1){ 97 p=p->next; 98 ++j; 99 } 100 if(!p) 101 return -1; 102 s->next=p->next; 103 p->next=s; 104 105 } 106 return 0; 107 } 108 109 int ListDelete(LinkList &L,int i,ElemType *e){ 110 int j=1; 111 LinkList p=L,q; 112 if(i<1) 113 return -1; 114 else if(i==1){ 115 L=p->next; 116 *e=p->data; 117 free(p); 118 119 } 120 121 else{ 122 while(p->next&&j<i-1){ 123 ++j; 124 p=p->next; 125 } 126 if(!p>next||j>i-1) 127 return -1; 128 q=p->next; 129 p->next=q->next; 130 *e=q->data; 131 free(q); 132 133 } 134 return 0; 135 } 136 137 void ListTraverse(LinkList L,void(*vi)(int)){ 138 LinkList p=L; 139 while(p){ 140 vi(p->data); 141 p=p->next; 142 } 143 printf("\n"); 144 } 145 146 147 148