zoukankan      html  css  js  c++  java
  • 链表_初步认识

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

    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
    ");
     8         printf("<a> add one name
    ");
     9         printf("<d> del one name
    ");
    10         printf("<x> exit
    ");
    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
    ");
    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
    ", i++, ptCur->name);
     9         ptCur = ptCur->next;
    10     }
    11 }
  • 相关阅读:
    关于Java中变量的意义和注意事项
    成为Android高手的十个建议
    成为Java高手的25个学习目标(经典)
    流体力学神器:Naiad 0.6 Windows版试用
    饭前念诵+感恩辞+感恩白開水
    Android 基本开发规范(必读)
    Python批量重命名Maya场景中的3D物体
    Java高新技术视频笔记:反射
    程序员编程技术迅速提高的终极攻略
    三十、有关联网问题
  • 原文地址:https://www.cnblogs.com/Lwd-linux/p/6160763.html
Copyright © 2011-2022 走看看