C语言——静态链表和动态链表

一、静态链表

创建链表中的一个节点,用struct来创建,其中包含两个部分:数据域和指针域。

创建三个结点,node1、node2、node3,分别赋值,初始化为NULL。接着就是将这些节点进行连接,组成链表。连接是通过指针来进行的。头节点是node1,node1的指针指向node2,也就是取node2的地址,以此类推。

随后,再定义一个可移动的指针,初始化指向头节点。 节点数据的遍历就是通过pCurrent = pCurrent->next;这个语句来移动的。一直到最后一个节点,指向为NULL时才结束遍历。并且,每次遍历都进行打印。

代码如下

#include <stdio.h>
struct LinkNode
{
    int data;
    struct LinkNode *next;
};
int main()
{

    struct LinkNode node1 = { 10,NULL };
    struct LinkNode node2 = { 20,NULL };
    struct LinkNode node3 = { 30,NULL };

    node1.next = &node2;
    node2.next = &node3;

    struct LinkNode* pCurrent = &node1;
    while (pCurrent != NULL)
    {
        printf("%d\n", pCurrent->data);
        pCurrent = pCurrent->next;
    }

    return 0;
}

结果

二、动态链表

动态链表的开辟需要借助malloc函数来实现

首先还是创建节点,一个节点中包括两部分,一部分是数据域,一部分是指针域。

初始化链表。为了能够对实现循环输入,我们利用while(1)来实现死循环

struct LinkNode* pRear = header;同样创建了一个指针,初始化指向头节点

每次创建新的节点执行这句话:struct LinkNode* newnode = malloc(sizeof(struct LinkNode));

记住,每次创建的只是节点,节点的连接需要指针,节点相连就是链表。

pRear->next = newnode;节点的相互连接就是通过这种方式来实现的

pRear = newnode;并且这个可移动的指针会不断的跟新位置。

代码如下:

#include <stdio.h>
#include <stdlib.h>
struct LinkNode
{
    int data;
    struct LinkNode* next;
};
struct LinkNode* Init_LinkList()
{
    struct LinkNode* header = malloc(sizeof(struct LinkNode));
    header->next = NULL;
    header->data = -1;
    struct LinkNode* pRear = header;
    int val = -1;
    while (1)
    {
        printf("请输入要插入的数据:\n");
        scanf_s("%d", &val);
        if (val == -1)
        {
            break;
        }
        struct LinkNode* newnode = malloc(sizeof(struct LinkNode));
        newnode->data = val;
        newnode->next = NULL;

        pRear->next = newnode;

        pRear = newnode;
    }
    return header;
}
void for_each_linklist(struct LinkNode* header)
{
    struct LinkNode* pCurrent = header->next;

    while (pCurrent != NULL)
    {
        printf("%d ", pCurrent->data);
        pCurrent = pCurrent->next;
    }
}
int main()
{
    struct LinkNode* header = Init_LinkList();
    for_each_linklist(header);
    return 0;
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值