• 链表的简单操作


    今天晚上又重新温故了链表的简单操作

    1关于链表的定义在此不多赘述,该文件为link.h文件

    #define ElemType char
    
    
    typedef struct Node
    {
        ElemType data;
        struct Node * next;
    }Node, *LinkList;

    初始化

    #include <stdio.h>
    #include "link.h"
    
    // init
    void InitList(LinkList *L)
    {
        *L = (LinkList)malloc(sizeof(Node));
        (*L)->next = NULL;
    }
    
    int main(int argc, char const *argv[])
    {
        Node *p = NULL;
        InitList(&p);
        return 0;
    }

    在初始化时候,为什么形参是一个二级指针呢?

    看主函数,我们明白p所指向的事一个头结点,头结点的下一个结点才是第一个元素结点,这也是为什么p为二级指针的原因

    2接下来是链表的插入,输入若干个字符以‘$’为结束符

    // 用头插法创建链表
    
    void CreatFromHead(LinkList L)
    {
        Node *s;
        char c;
        int flag = 1;
        while(flag)
        {
            c = getchar();
            if(c != '$')
            {
                s = (LinkList)malloc(sizeof(Node));
                s->data = c;
                s->next = L->next;
                L->next = s;
            }
            else
            {
                flag = 0;
            }
        }
    }
    
    void CreatFromTail(Node *L)
    {
        Node *r, *s;
        char c;
        int flag = 1;
        r = L;
        while(flag)
        {
            c = getchar();
            if(c != '$')
            {
                s = (LinkList)malloc(sizeof(Node));
                s->data = c;
                r->next = s;
                r = s;
            }
            else
            {
                flag = 0;
                r->next = NULL;
            }
        }
    }

    输入1234,对应头插法的结果是4321,对应尾插法的结果是1234

    3链表的打印

    void print(Node *L)
    {
        Node *t, *p = L;
        t = p->next;                //t是头结点
        while(t != NULL)
        {
            printf("%c", t->data);
            t = t->next;
        }
    }

    因为链表的第一个元素是第二个结点,因此我们定义了t变量

    4查出第链表中第i个元素

    Node* Get(Node *L, int i)
    {
        Node *p;
        int j = 0;
        if(i < 0)
            return NULL;
        p = L;
        
        for(j = 0; j < i && p->next != NULL; j++)
        {
            p = p->next;
        }
        if(j == i)
            return p;
        else
            return NULL;
    }

    也比较简单,在遍历的时候考虑,有没有结束和是否到了i这个位置两个因素即可。

    下面是所有的代码

     1 #include <stdio.h>
     2 #include "link.h"
     3 
     4 // init
     5 void InitList(LinkList *L)
     6 {
     7     *L = (LinkList)malloc(sizeof(Node));
     8     (*L)->next = NULL;
     9 }
    10 
    11 // 用头插法创建链表
    12 
    13 void CreatFromHead(LinkList L)
    14 {
    15     Node *s;
    16     char c;
    17     int flag = 1;
    18     while(flag)
    19     {
    20         c = getchar();
    21         if(c != '$')
    22         {
    23             s = (LinkList)malloc(sizeof(Node));
    24             s->data = c;
    25             s->next = L->next;
    26             L->next = s;
    27         }
    28         else
    29         {
    30             flag = 0;
    31         }
    32     }
    33 }
    34 
    35 void CreatFromTail(Node *L)
    36 {
    37     Node *r, *s;
    38     char c;
    39     int flag = 1;
    40     r = L;
    41     while(flag)
    42     {
    43         c = getchar();
    44         if(c != '$')
    45         {
    46             s = (LinkList)malloc(sizeof(Node));
    47             s->data = c;
    48             r->next = s;
    49             r = s;
    50         }
    51         else
    52         {
    53             flag = 0;
    54             r->next = NULL;
    55         }
    56     }
    57 }
    58 
    59 
    60 void print(Node *L)
    61 {
    62     Node *t, *p = L;
    63     t = p->next;                //t是头结点
    64     while(t != NULL)
    65     {
    66         printf("%c", t->data);
    67         t = t->next;
    68     }
    69 }
    70 
    71 Node* Get(Node *L, int i)
    72 {
    73     Node *p;
    74     int j = 0;
    75     if(i < 0)
    76         return NULL;
    77     p = L;
    78     
    79     for(j = 0; j < i && p->next != NULL; j++)
    80     {
    81         p = p->next;
    82     }
    83     if(j == i)
    84         return p;
    85     else
    86         return NULL;
    87 }
    88 
    89 int main(int argc, char const *argv[])
    90 {
    91     Node *p = NULL;
    92     InitList(&p);
    93     CreatFromTail(p);
    94     print(p);
    95     return 0;
    96 }

    心得:

    哈哈,再一次玩链表是靠自己一点点看书,自己一点点理解起来,说真的当时院长讲链表的时候自己一点也没搞清楚,但是自己花时间琢磨,慢慢的也就理解了

  • 相关阅读:
    java类实现 指定网站信息采集
    通过jxl.jar 读取、导出excel的小例子
    SQL使用CASE WHEN THEN
    动态查询的实现
    Oracle 查询存储过程 做横向报表
    文本信息 生成二维码 例子
    将对象转换为指定的Map
    eclipse 插件大全
    让人看了舒服的清爽颜色搭配CSS
    spring 定时任务 实现
  • 原文地址:https://www.cnblogs.com/hello-lijj/p/6582166.html
Copyright © 2020-2023  润新知