数据结构之单链表的生成(C语言实现,详细分解)

数据结构之单链表的生成(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上写博客,也是刚刚开始接触数据结构,所写的内容不免会有一些错误或者表达不清的地方,恳请浏览过此篇博客的人留言批评指正,必定感激不尽.

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值