数据结构之单链表的⽣成(C语⾔实现,详细分解)
数据结构之单链表的⽣成(C语⾔实现)
⼀、线性链表
(1)什么是线性链表
c语言struct头文件通俗的讲就是每⼀个链表都是由⼀个⼀个的节点组成的。每个节点都包括两个域,⼀个是数据域,另⼀个是指针域。
数据域:存储数据元素信息的域称之为数据域。
指针域:存储直接后继存储位置的域称之为指针域。指针域中存储的信息称作指针或链。
(所谓的域就是区域的意思,存储数据的就称之为数据域,存储指针的就称之为指针域)
单链表
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的链表
return0;
}
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上写博客,也是刚刚开始接触数据结构,所写的内容不免会有⼀些错误或者表达不清的地⽅,恳请浏览过此篇博客的⼈留⾔批评指正,必定感激不尽.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论