C/C++数据结构之链表(一步一步拆解单链表)

困扰了很久的数据结构重新拾起来,参考博客大牛的文章,思考出一点自己的理解,希望给在学习数据结构这条路上的兄弟姐妹有所帮助,也为自己家能够理清思路。废话不多说,直接上代码。

所需头文件如下并且屏蔽安全警告:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

 首先声明链表的数据类型,习惯方法如下:

typedef struct ListNode {
    int  data;        //    数据域,存放数据
    struct ListNode* Next;        //    指向下一个链表节点
}Node, *PNode;

这里有两点需要注意一下:1、如果是cpp文件,结构体中的struct ListNode * Next可写为ListNode* Next;2、这里使用了宏typedef关键字,则Node和PNode为新声明的数据类型名称,类似于已有的int,char,double等。Node是结构体类型,PNode是结构体指针类型,如需了解结构体移步另外一篇文章。

接下来看链表创建函数定义

PNode CreateList(void) {
    int len;    //    用于定义链表长度
    int val;    //    用于存放节点数值
    PNode PHead = (PNode)malloc(sizeof(Node));    //    创建分配一个头节点内存空间
    //头节点相当于链表的哨兵,不存放数据,指向首节点(第一个节点)
    if (PHead == NULL)    //    判断是否分配成功
    {
        printf("空间分配失败 \n");
        exit(-1);
    }
    //指向链表尾部的指针,个人认为PTail是在栈空间上的,是一个辅助指针,用于连接新的节点
    PNode PTail = PHead;    //    链表的末尾节点,初始指向头节点
    PTail->Next = NULL;    //    最后一个节点指针置为空
    printf("请输入节点个数:");
    scanf("%d", &len);        //    输入节点个数
    for (int i = 0; i < len; i++) {

        PNode pNew = (PNode)malloc(sizeof(Node));    //    分配一个新节点
        if (pNew == NULL) {
            printf("分配新节点失败\n");
            exit(-1);
        }
        printf("请输入第 %d 个节点的数据:", i + 1);
        scanf_s("%d", &val);    //    输入链表节点的数据

        pNew->Element = val;    //    把数据赋值给节点数据域
        PTail->Next = pNew;    //    末尾节点指针指向下一个新节点,连接新的节点
        pNew->Next = NULL;        //    新节点指针指向为空
        PTail = pNew;    //    将新节点复制给末尾节点   ,将PTail指向尾节点    
    }
    printf("创建链表成功\n"
        );
    return PHead;    //    返回头节点
}

最后看主函数

int main() {
    PNode List = CreateList();    //创建一个指针,使其指向新创建的链表的头指针    
    return 0;
}

 

posted @ 2018-04-07 22:49  无极至上  阅读(3182)  评论(0编辑  收藏  举报