根據代碼來分析鏈表的操作 eg: 1.定義一個結構體,並定義一個表頭指針 2.編寫main函數 main函數主要接收外面傳進來的參數,作出一系列操作。 l:顯示所有的名字 a:添加一個名字 d:刪除一個名字 x:退出操作 3.完善各個函數的編寫 3.1 add_one_name和add_name函數 ...
根據代碼來分析鏈表的操作
eg:
1.定義一個結構體,並定義一個表頭指針
1 typedef struct NAME{ 2 char *name; 3 struct NAME *pre; 4 struct NAME *next; 5 }T_Name, *PT_Name; 6 7 static PT_Name g_ptNameHead;
2.編寫main函數
1 int main(int argc, char **argv) 2 { 3 char c; 4 5 while (1) 6 { 7 printf("<l> List all the names\n"); 8 printf("<a> add one name\n"); 9 printf("<d> del one name\n"); 10 printf("<x> exit\n"); 11 12 13 printf("Enter the choise: "); 14 15 c = getchar(); 16 switch (c) 17 { 18 case 'l': 19 { 20 list_all_name(); 21 break; 22 } 23 case 'a': 24 { 25 add_one_name(); 26 break; 27 } 28 case 'd': 29 { 30 del_one_name(); 31 break; 32 } 33 case 'x': 34 { 35 return 0; 36 break; 37 } 38 default: 39 { 40 break; 41 } 42 } 43 } 44 45 return 0;
main函數主要接收外面傳進來的參數,作出一系列操作。
l:顯示所有的名字
a:添加一個名字
d:刪除一個名字
x:退出操作
3.完善各個函數的編寫
3.1 add_one_name和add_name函數
1 void add_one_name() 2 { 3 PT_Name ptNew; 4 char *str; 5 char name[128]; 6 7 printf("enter the name:"); 8 scanf("%s", name); 9 10 str = malloc(strlen(name) + 1); 11 strcpy(str, name); 12 13 ptNew = malloc(sizeof(T_Name)); 14 ptNew->name = str; 15 ptNew->pre = NULL; 16 ptNew->next = NULL; 17 18 add_name(ptNew); 19 }
add_name函數主要把內容填充進來,構造ptNew結構體
1 void add_name(PT_Name ptNew) 2 { 3 PT_Name ptCur; 4 5 if (g_ptNameHead == NULL) 6 { 7 g_ptNameHead = ptNew; 8 } 9 else 10 { 11 ptCur = g_ptNameHead; 12 while (ptCur->next) 13 { 14 ptCur = ptCur->next; 15 } 16 ptCur->next = ptNew; 17 ptNew->pre = ptCur; 18 } 19 }
add_name函數主要在鏈表的末尾添加新的鏈表,並記錄其前一個鏈表的地址,實現雙向鏈表的作用。
3.2 del_one_name、get_name和del_name函數
1 void del_one_name() 2 { 3 PT_Name ptFind; 4 char name[128]; 5 6 printf("enter the name:"); 7 scanf("%s", name); 8 9 ptFind = get_name(name); 10 if (ptFind == NULL) 11 { 12 printf("do not have this name\n"); 13 return ; 14 } 15 16 del_name(ptFind); 17 18 }
PT_Name get_name(char *name) { PT_Name ptCur; if (g_ptNameHead == NULL) { return NULL; } else { ptCur = g_ptNameHead; do { if (strcmp(ptCur->name, name) == 0) return ptCur; else ptCur = ptCur->next; }while (ptCur); } return NULL; }
1 void del_name(PT_Name ptDel) 2 { 3 PT_Name ptCur; 4 PT_Name ptPre; 5 PT_Name ptNext; 6 7 if (g_ptNameHead == ptDel) 8 { 9 g_ptNameHead = ptDel->next; 10 /* 釋放 */ 11 return; 12 } 13 else 14 { 15 ptCur = g_ptNameHead->next; 16 while (ptCur) 17 { 18 if (ptCur == ptDel) 19 { 20 /* 從鏈表中刪除 */ 21 ptPre = ptCur->pre; 22 ptNext = ptCur->next; 23 ptPre->next = ptNext; 24 if (ptNext) 25 { 26 ptNext->pre = ptPre; 27 } 28 break; 29 } 30 else 31 { 32 ptCur = ptCur->next; 33 } 34 } 35 } 36 37 free(ptDel->name); 38 free(ptDel); 39 }
get_name函數主要是從輸入端獲取要刪除的name,並找到其對應的結構體返回。del_name函數主要是根據傳入的ptDel參數,把該結構體從鏈表中除去。
3.3list_all_name
list_all_name函數主要是實現鏈表的顯示
1 void list_all_name(void) 2 { 3 PT_Name ptCur; 4 int i = 0; 5 ptCur = g_ptNameHead; 6 while (ptCur) 7 { 8 printf("%02d : %s\n", i++, ptCur->name); 9 ptCur = ptCur->next; 10 } 11 }