1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 5 typedef int DataType; 6 typedef struct node{ //結點類型定義 7 DataType data; //結點的數據域 8 struct node *next; //結點的指針域 9 }ListNode,*LinkList; 10 ListNode *p; 11 LinkList head; 12 /*注意:定義結點結構時,有幾點需要注意: 13 LinkList和ListNode *是不同名字的同一個指針類型, 14 LinkList類型的指針變量head表示他是單鏈表的頭指針, 15 ListNode *類型的指針變量p表示它是指向某一結點的指針*/ 16 LinkList InitList() 17 { 18 LinkList L; 19 L=(ListNode*)malloc(sizeof(ListNode)); 20 if(L==NULL) 21 { 22 printf("分配空間失敗!"); 23 exit(1); 24 } 25 L->next=NULL; 26 return L; 27 } 28 29 /*頭插法建立單鏈表*/ 30 LinkList CreatListF() 31 { 32 DataType x; 33 LinkList L; 34 ListNode *s; 35 L=(ListNode *)malloc(sizeof(ListNode)); //頭結點 36 if(L==NULL) //檢查L是否分配到儲存空間 37 { 38 printf("分配空間失敗!"); 39 exit(1); 40 } 41 L->next=NULL; 42 scanf("%d",&x); 43 while(x!=0) 44 { 45 s=(ListNode *)malloc(sizeof(ListNode)); //為新插入的結點申請空間 46 if(s==NULL) 47 { 48 printf("分配空間失敗!"); 49 exit(1); 50 } 51 s->data=x; 52 s->next=L->next; 53 L->next=s; 54 scanf("%d",&x); 55 } 56 return L; 57 } 58 59 60 /*尾插法建立單鏈表*/ 61 LinkList CreatListL() 62 { 63 DataType x; 64 LinkList L=(ListNode *)malloc(sizeof(ListNode)); //頭結點 65 if(L==NULL) 66 { 67 printf("分配空間失敗!"); 68 exit(1); 69 } 70 ListNode *s,*r; 71 r=L; 72 scanf("%d",&x); 73 while(x!=0) //以0輸入表示結束 74 { 75 s=(ListNode *)malloc(sizeof(ListNode)); //為新插入的結點申請空間 76 if(s==NULL) 77 { 78 printf("分配空間失敗!"); 79 exit(1); 80 } 81 s->data=x; 82 r->next=s; 83 r=s; 84 scanf("%d",&x); 85 } 86 r->next=NULL; //單鏈表的最后一個指針為空 87 return L; 88 } 89 90 //獲取鏈表長度 91 int GetLength(LinkList L) 92 { 93 int num=0; 94 ListNode *p; 95 p=L->next; 96 while(p!=NULL) 97 { 98 num++; 99 p=p->next; 100 } 101 return(num); 102 } 103 104 //查找第i位元素 105 ListNode *GetNode(LinkList L,int i) 106 { 107 int j=1; 108 ListNode *p; 109 if(i<1||i>GetLength(L)) 110 { 111 printf("查找的位置不正確!"); 112 exit(1); 113 } 114 p=L->next; 115 while(p!=NULL&&j<i) 116 { 117 p=p->next; 118 j++; 119 } 120 return p; 121 } 122 123 //查找元素x 124 int LocateListi(LinkList L,DataType x) 125 { 126 ListNode *p=L->next; 127 int i=1; 128 while(p!=NULL&&p->data!=x) 129 { 130 p=p->next; 131 i++; 132 } 133 if(p==NULL) 134 return 0; 135 else 136 return i; 137 } 138 139 //在第i位插入元素x 140 void InsertList(LinkList L,DataType x,int i) 141 { 142 ListNode *p,*q,*s; 143 int j=1; 144 p=L; 145 if(i<1||i>GetLength(L)+1) 146 { 147 printf("插入位置不正確!"); 148 exit(1); 149 } 150 s=(ListNode *)malloc(sizeof(ListNode)); 151 if(s==NULL) 152 { 153 printf("分配空間失敗!"); 154 exit(1); 155 } 156 s->data=x; 157 while(j<=i) 158 { 159 q=p; 160 p=p->next; 161 j++; 162 } 163 s->next=p; 164 q->next=s; 165 } 166 167 //刪除第i位元素 168 void DeleteList(LinkList L,int i) 169 { 170 ListNode *p,*q; 171 int j=1; 172 p=L; 173 if(i<1||i>GetLength(L)) 174 { 175 printf("刪除位置不正確!"); 176 exit(1); 177 } 178 while(j<i) 179 { 180 p=p->next; 181 j++; 182 } 183 q=p->next; 184 p->next=q->next; 185 free(q); 186 } 187 188 //打印鏈表 189 void PrintList(LinkList L) 190 { 191 ListNode *p; 192 p=L->next; 193 printf("鏈表元素如下:\n"); 194 while(p!=NULL) 195 { 196 printf("%d ",p->data); 197 p=p->next; 198 } 199 printf("\n"); 200 } 201 int main() 202 { 203 DataType a; 204 head=InitList(); 205 printf("我們將采用頭插法創建一個單鏈表L!\n請輸入您要輸入的數據(以空格隔開,以0結束!)\n"); 206 head=CreatListF(); 207 printf("單鏈表的長度為:%d\n",GetLength(head)); 208 printf("請輸入您要查找元素的結點序號:"); 209 scanf("%d",&a); 210 printf("第%d個元素為:%d\n",a,GetNode(head,a)->data); 211 printf("請輸入您要查找的元素:"); 212 scanf("%d",&a); 213 printf("您查找的元素%d在鏈表中的第%d個位置\n",a,LocateListi(head,a)); 214 int x,i; 215 printf("請輸入您要插入元素的數值以及位置:"); 216 scanf("%d%d",&x,&i); 217 InsertList(head,x,i); 218 PrintList(head); 219 printf("請輸入您想要刪除元素的位置:"); 220 scanf("%d",&i); 221 DeleteList(head,i); 222 PrintList(head); 223 return 0; 224 }
