根据代码来分析链表的操作
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 }