数据结构之单链表的生成(C语言实现)
一、线性链表
(1)什么是线性链表
通俗的讲就是每一个链表都是由一个一个的节点组成的。每个节点都包括两个域,一个是数据域,另一个是指针域。
数据域:存储数据元素信息的域称之为数据域。
指针域:存储直接后继存储位置的域称之为指针域。指针域中存储的信息称作指针或链。
(所谓的域就是区域的意思,存储数据的就称之为数据域,存储指针的就称之为指针域)
单链表
N个节点链接成一个链表,即为线性表的链式储存结构,当这个链表中的每个节点只包含一个指针域,且这个指针域只指向后面的节点,则称之为单链表。
(2)单链表的具体构成
首节点:第一个有效节点
尾节点:最后一个有效节点
头节点:第一个有效节点之前的那个节点;头节点并不存放有效数据;头结点的数据类型和之后节点的数据类型相同;加头节点的目的主要是为了对链表的操作。
头指针:指向头节点的指针变量(存放头节点的地址)。
尾指针:指向尾节点的指针变量(存放尾节点的地址)。
二、单链表的C语言生成(链表的创建和遍历)
(1) C 程序
//头文件
#include <stdio.h>
#include <malloc.h> //动态分配内存所需要的头文件(包含malloc函数)
#include <stdlib.h> //包含exit函数
typedef struct Node
{
int date; //数据域
struct Node * pNext; //指针域
}NODE,*PNODE; //NODE代表struct Node;PNODE 代表struct Node *
//函数声明
PNODE create_list(void); //创建一个链表,并返回该链表的头指针
void traverse_list(PNODE pHead);//遍历一个链表(函数输入的是需要遍历的链表的头指针,返回值为空)
//主函数
int main (void)
{
PNODE pHead = NULL; //等价于struct Node * pHead = NULL。定义一个头指针pHead,并令这个指针为空
pHead = create_list(); //功能:创建一个非循环单链表,并将该链表的头指针(头节点的地址)赋给pHead
traverse_list(pHead); //功能:遍历一个头指针位pHead的链表
return 0;
}
PNODE create_list(void)
{
int i;
int len; //用来存放有效节点的个数
int val; //用来存放用户输入节点的值
/**************************************
对于新手来说一定不要混淆局部变量与全局变量
下面语句的pHead 与主函数中的pHead并不是同一个变量
***************************************/
PNODE pHead = (PNODE)malloc(sizeof(NODE)); //定义了一个PNODE类型的指针pHead;动态的分配了一块NODE类型大小的内存,并将该内存的地址赋给pHead。也就是生成一个头节点
if (NULL == pHead)
{
printf("内存分配失败,程序终止!!\n");
exit(-1);
}
PNODE pTail = pHead; //定义了一个指向尾节点的结构体指针pTail,并令其等于phead
//因为此时整个链表只有一个头节点,所以该头节点也就是尾节点
pTail->pNext = NULL; //将尾节点的指针域赋值为空
printf("请输入您想要生成的节点的个数: len = ");
scanf("%d",&len);
for(i = 0; i<len;i++)
{
printf("请输入第%d个节点的值: ",i+1); //普通人从一开始计数(程序猿从0开始,手动滑稽)
scanf("%d",&val);
PNODE pNew = (PNODE)malloc(sizeof(NODE)); //定义了一个PNODE类型的指针变量pNew
//动态的分配了一块NODE类型大小的内存,并将该内存的地址赋给pNew
//临时定义一个节点
if (NULL == pNew)
{
printf("内存分配失败,程序终止!!\n");
exit(-1);
}
pNew->date = val; //将用户输入的值赋给临时节点的数据域
pTail->pNext = pNew; //将临时节点挂在尾节点的后面
pNew->pNext = NULL; //将临时节点的指针域赋值为空
pTail = pNew; //将尾指针赋值为临时节点的地址,此时尾节点就变成了临时节点
}
return pHead;
}
void traverse_list(PNODE pHead) //遍历一个头指针位pHead的链表
{
PNODE p = pHead->pNext; //定义一个PNODE类型的指针变量p,并让p指向了链表的首节点(第一个存放有效数据类型的节点)
while(p != NULL) //只要p不为空(p不是尾节点的指针域),就继续循环
{
printf("%d ",p->date);
p = p->pNext;
}
return;
}
(2)程序说明
本程序基本依照郝斌老师数据结构视频中的程序而写,经过dev C++5.11编译运行后没有出错,可直接复制到编译器中运行
三、关于此篇博客
这是我第一次在CSDN上写博客,也是刚刚开始接触数据结构,所写的内容不免会有一些错误或者表达不清的地方,恳请浏览过此篇博客的人留言批评指正,必定感激不尽.