链表_初步认识

2016-12-12 08:29:51来源:cnblogs.com作者:wade_linux人点击

第七城市

根据代码来分析链表的操作

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 }

 

第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台