首页 > 代码库 > 链表_初步认识

链表_初步认识

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

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 }

 

链表_初步认识