C语言基础教程:单链表(尾插法)

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。 单链表(单向链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始,如下图所示。

本文将结合代码详解C语言链表,单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下一个储存节点的地址,C语言详细代码及注释如下。

源码展示:

#include <stdio.h>
//节点类型
struct Node{
	int				n;		//数据    
	struct Node*	pNext;	//连接
};

//创建节点
struct Node* CreateNode(int n);

//增加节点
//头插法		新增节点  是第一个节点      把哪个节点插入到哪个链表中
void insertToHead(int n, struct Node** list);
//尾插法		新增节点  是最后一个节点
void insertToTail(int n, struct Node** list);


//中间插入   新增节点  是第N个节点
void insertToNum(int n, struct Node** list,int num);


//找链表中第num个节点,找到返回其地址,找不到返回NULL
struct Node* findPos(struct Node* list, int num);


//遍历
void travel(struct Node* list);

int main(){
	//pList是个链表
	struct Node* pList = NULL;
	travel(pList);
	for (int i = 1; i < 10; i++){
		insertToHead(i, &pList);
	}

	travel(pList);
	struct Node* pTemp = findPos(pList, 1);
	if (pTemp){
		printf("找到了:%d\n", pTemp->n);
	}
	else{
		printf("没找到!\n");
	}

	while (1);
	return 0;
}

//创建节点
struct Node* CreateNode(int n){
	//1 申请内存
	struct Node* pNew = (struct Node*)malloc(sizeof(struct Node));
	if (NULL == pNew){
		printf("申请内存失败!\n");
		return NULL;
	}
	//2 成员赋值
	pNew->n = n;
	pNew->pNext = NULL;//空指针  没有赋值   野指针
	//3 返回
	return pNew;
}

//头插法		新增节点  是第一个节点      把哪个节点插入到哪个链表中
void insertToHead(int n, struct Node** list){
	if (NULL == *list){//是否空链表
		*list = CreateNode(n);
	}
	else{
		struct Node* pNew = CreateNode(n);//创建新节点
		//新节点的next指针指向*list指向的节点
		pNew->pNext = *list;
		//*list指向pNew
		*list = pNew;
	}
}

//遍历
void travel(struct Node* list){
#if 0
	struct Node* pTemp = list;
	printf("list:");
	while (pTemp){//while (NULL != pTemp){
		//if (NULL == pTemp) break;
		printf("%d ", pTemp->n);

		pTemp = pTemp->pNext;//pTemp指向下一个
	}
	printf("\n");
#else 
	printf("list:");
	while (list){
		printf("%d ", list->n);
		list = list->pNext;//pTemp指向下一个
	}
	printf("\n");
#endif
}

//尾插法		新增节点  是最后一个节点
void insertToTail(int n, struct Node** list){
	if (*list){//为空
		*list = CreateNode(n);
	}
	else{//不为空
		struct Node* pTemp = *list;//创建临时指针
		//让pTemp指向链表尾节点
		while (pTemp->pNext){
			pTemp = pTemp->pNext;
		}
		//pTemp的next连接新节点
		pTemp->pNext = CreateNode(n);
	}
}

//中间插入   新增节点  是第N个节点
void insertToNum(int n, struct Node** list, int num){
	//1 先找到第num-1个节点 //如果找不到 尾插法或者头插法随意

	//2 找到了  新节点的next指针,指向第num-1个节点的next

	//3 新节点成为第num-1个节点 的next
}

//找链表中第num个节点,找到返回其地址,找不到返回NULL
struct Node* findPos(struct Node* list, int num){
	int count = 1;
	while (1){
		if (NULL == list) break;
		if (count == num) return list;

		list = list->pNext;
		count++;
	}

	return NULL;
}

视频教程:

【C语言数据结构】链表详解!1小时搞定计算机二级C语言最难链表,看完保会!_哔哩哔哩_bilibili​www.bilibili.com/video/BV1hg411N7Pu?spm_id_from=333.999.0.0正在上传…重新上传取消​icon-default.png?t=LA92https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/BV1hg411N7Pu%3Fspm_id_from%3D333.999.0.0

 我有一个编程学习群,里面有各种C/C++项目资料、教程及源码等,欢迎大家一起来学习交流哦~

扫下方二维码即可进入

 

 

 

 

 

おすすめ

転載: blog.csdn.net/weixin_58045538/article/details/121439839