根据代码来分析链表的操作
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 else10 {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 else14 {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 else31 {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 }
爱上一个人的时候,总会有点害怕,怕得到他;怕失掉他。