欢迎来到军工软件开发人才培养基地——学到牛牛

单向链表

时间:2024-05-06 07:01:10 来源:学到牛牛

单链表:单链表是一种链式存取的数据结构,用一组地址任意的储存单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个节点的构成:元素(数据元素的映像)+指针(指示后继元素存储位置),元素就是存储数据的数据单元,指针就是连接每个结点的地址数据

单链表的数据结构

head为头结点,不存放任何数据,它的作用是充当一个指向链表中真正存放数据的第一个节点

其中DATA为数据域,该内存存放的是数据;NEXT是地址域,数据类型为指针,该内存存放的是下一段内存的内存地址

有头链表

有头链表指的是链表初始化时就有一个头结点,并且头指针始终指向该头结点,该头结点的数据域不存在数据。如图所示

循环链表

循环链表指的是链表的尾节点指针指向头节点地址,从而形成环状如图:

单链表

源码如下:

#include <stdio.h>

 

struct link  //结构体

{

    int data;  //数据域

    struct  link *next;  //指针域

};

 

int main()

{

    struct link n0, n1, n2;

    n0.data = 10; 

    n1.data = 20;

    n2.data = 30;

    n0.next = &n1;

    n1.next = &n2;

    n2.next = NULL;

    printf("%d\n", n0.data);

    printf("%d\n", n0.p->data);

    printf("%d\n", n1.p->data);

    return 0;

}

*“.”和“->”的区别

C语言中“.”的意思是给的是立即数地址,“->”的意思是给的是指针。"."的左操作数为值,"->"的左操作数为指针。"."和"->"实际是可以合并为一个操作符的,在很多新语言中对值和指针取成员已经统一为"."了,C中保留只是一种传统的延续。

*结构体

结构体在C语言中属于自定义数据类型,我们知道数组是同一数据类型的集合,那结构体可以看成不同数据类型的集合,比如我们要存储一个游戏角色的名字、等级、血量值、防御值、职业、技能等级信息时,我们就会发现这些属性对应的是不同的数据类型,这种情况下,为了更好的对应角色,我们可以将它们的相关信息全部封装到一个类型中,此时我们就会用到结构体来进行同意封装,所以结构体也是C语言编程中非常常见的一个数据类型

遍历、头插、尾插链表

#include <stdio.h>

#include <stdlib.h>

 

struct links

{

    int data;

    struct  links *next;    

};

 

void showList(struct links *p)//链表遍历

{

    while(p)

    {

        printf("%d\n", p->data);

        p = p->next;

    }

}

 

void installTail(struct links **h, struct links *n)//尾插法

{

    n->next = *h;

    *h = n;

}

 

struct links *headInsert(struct links *h, struct links *n)//头插法

{

    n->next = h;

    return n;

}

int main()

{

    struct links *head = NULL;

 struct links *h1 = NULL;

    int i = 0;

    int data[10] = {1,2,3,4,5,6,7,8,9,10};

    while (i < (sizeof(data) / sizeof(int)))

    {

        h1 = malloc(sizeof(struct links));

        h1->data = data[i];

        h1->next = NULL;

        installTail(&head,h1);

        //head = headInsert(head,h1);

        i++;

    }

   showList(head);

    return 0;

}

*malloc是动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。

 

最后附上一首秋瑾先生的词供大家赏析

满江红·小住京华

小住京华,早又是中秋佳节。为篱下黄花开遍,秋容如拭。

四面歌残终破楚,八年风味徒思浙。

苦将侬强派作蛾眉,殊未屑!

身不得,男儿列。心却比,男儿烈!

算平生肝胆,因人常热。俗子胸襟谁识我?英雄末路当磨折。

莽红尘何处觅知音?青衫湿!