动态数据结构——动态链表(malloc函数的使用)

所谓建立动态链表,是指在程序执行过程中从无到有地建立一个链表。即我们需要一个个地去开辟新节点,并且去输入节点的数据信息,然后建立起前后相连的关系。

下面我们开始尝试建立起一个动态链表:

1.结构体部分:

struct weapon{
    int price;
    int atk;
    struct weapon * next;
};

2.然后我们写一个创建链表的函数:

这个函数要求返回的是链表的头指针(head),所以将函数定义为struct weapon *类型。

struct weapon * create(){

}

在该函数中,首先定义三个指针变量,head、p1、p2,这三个变量都用来指向struct weapon类型数据。head是链表的头指针,p1指向链表当前新创建的节点,p2指向上一个节点。

    struct weapon * head;
    struct weapon * p1, * p2;

临时变量n用来记录节点的总个数。

int n = 0;

然后我们用malloc函数(注意引入头文件#include<malloc.h>)去开辟第一个节点,先让p1与p2都指向第一个节点。其中,malloc是分配内存块的函数,sizeof是判断数据类型长度符。

 p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));

之后,我们从键盘输入数据,赋值给第一个节点(p1)。由于最初链表不存在,所以给head置空。

    scanf("%d %d",&(p1->price),&(p1->atk));
    head = NULL;

接下来进入大批量输入数据的过程:

当遇到输入值为0时,输入过程结束:

 while(p1-> price != 0){

}

对n进行++操作,且对n=1进行一个特殊处理(当n=1时,对于第一个添加到链表中的节点p1,让head指向元素的地址,这就是头指针):

    n++;
    if(n == 1) {
        head = p1;
    }

如果不是第一个节点(即当n>1)时,就让当前节点的上一个节点去指向当前节点:

else{
    //p2为上一节点
    p2->next = p1;
}

然后用p2保存当前节点(p1)的信息,再让p1去开辟新的动态存储区:

    //更新
    p2 = p1;
    p1 = (struct weapon * )malloc(sizeof(struct weapon));

开辟新的存储区后,进入新的输入环节:

scanf("%d %d",&(p1->price),&(p1->atk));

当输入完新的值后,再次回到while的判定区,判断值是否为0:

while(p1-> price != 0){
    n++;
    if(n == 1) {
        head = p1;
    }else{
        //p2为上一节点
        p2->next = p1;
    }
    //更新
    p2 = p1;
    p1 = (struct weapon * )malloc(sizeof(struct weapon));
    scanf("%d %d",&(p1->price),&(p1->atk));
}

如果while循环结束,此时p2实际上是该链表的最后一个节点,我们将p2的next置空:

//此时p2为最后一个节点
p2->next = NULL;

最后,我们return头指针:

return (head);

create函数体完整代码:

struct weapon * create(){
    struct weapon * head;
    struct weapon * p1, * p2;
    int n = 0;
    p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));
    scanf("%d %d",&(p1->price),&(p1->atk));
    head = NULL;
    while(p1-> price != 0){
        n++;
        if(n == 1) {
            head = p1;
        }
        else{
            //p2为上一节点
            p2->next = p1;
        }
        //更新
        p2 = p1;
        p1 = (struct weapon * )malloc(sizeof(struct weapon));
        scanf("%d %d",&(p1->price),&(p1->atk));
    }
    //此时p2为最后一个节点
    p2->next = NULL;
    return (head);
};

3.在main函数进行函数的调用:

int main()
{
    struct weapon * p;
    p = create();
    //打印头指针
    printf("%d,%d",p->price,p->atk);
    return 0;
}

4.完整代码如下:

#include<stdio.h>
#include<malloc.h>
struct weapon{
    int price;
    int atk;
    struct weapon * next;
};

struct weapon * create(){
    struct weapon * head;
    struct weapon * p1, * p2;
    int n = 0;
    p1 = p2 = (struct weapon * )malloc(sizeof(struct weapon));
    scanf("%d %d",&(p1->price),&(p1->atk));
    head = NULL;
    while(p1-> price != 0){
        n++;
        if(n == 1) {
            head = p1;
        }
        else{
            //p2为上一节点
            p2->next = p1;
        }
        //更新
        p2 = p1;
        p1 = (struct weapon * )malloc(sizeof(struct weapon));
        scanf("%d %d",&(p1->price),&(p1->atk));
    }
    //此时p2为最后一个节点
    p2->next = NULL;
    return (head);
};

int main()
{
    struct weapon * p;
    p = create();
    //打印头指针
    printf("%d,%d",p->price,p->atk);
    return 0;
}

5.运行输入:

结果:

  • 26
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在C语言使用malloc函数可以动态地分配内存空间。下面是一个示例,演示了如何使用malloc函数来分配空间并创建一个单向链表: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建链表节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode == NULL) { printf("内存分配失败\n"); return NULL; } newNode->data = data; newNode->next = NULL; return newNode; } // 初始化链表 Node* initList() { Node* head = createNode(0); // 创建头节点 if (head == NULL) { return NULL; } return head; } // 在链表末尾插入节点 void insertNode(Node* head, int data) { Node* newNode = createNode(data); if (newNode == NULL) { return; } Node* temp = head; while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } // 打印链表 void printList(Node* head) { Node* temp = head->next; // 跳过头节点 while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } // 释放链表内存 void freeList(Node* head) { Node* temp = head; while (temp != NULL) { Node* nextNode = temp->next; free(temp); temp = nextNode; } } int main() { Node* head = initList(); // 初始化链表 if (head == NULL) { return 0; } insertNode(head, 1); // 在链表末尾插入节点 insertNode(head, 2); insertNode(head, 3); printList(head); // 打印链表 freeList(head); // 释放链表内存 return 0; } ``` 这段代码演示了如何使用malloc函数来分配空间并创建一个单向链表。首先,我们定义了一个链表节点结构体,包含数据和指向下一个节点的指针。然后,我们实现了创建节点、初始化链表、插入节点、打印链表和释放链表内存的函数。在主函数,我们初始化链表,插入节点,打印链表,最后释放链表内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值