C语言实现单链表的基本功能详解

 更新时间:2021年11月24日 16:22:51   作者:我是一个小小孩  
链表是一个结构体实现的一种线性表,它只能从前往后,不可以从后往前,在实现单链表的操作时,需要用指针来操作。本文主要介绍了实现单链表的基本功能的代码示例,具有一定价值,感兴趣的同学可以学习一下

1.首先简单了解一下链表的概念:

要注意的是链表是一个结构体实现的一种线性表,它只能从前往后,不可以从后往前(因为next只保存下一个节点的地址).在实现单链表的操作时,需要用指针来操作.很简单,注释写的很详细,欢迎大家指正哈哈哈哈~之前写的太烂了重新写了一下.....

2.代码展示:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef struct linklist {
	int data;
	struct linklist* next;
}node;
//目录
//1.动态申请节点
node* Creatnode(int x);
//2.单链表的尾插
void PushBack(node** plist, int x);
//3.单链表的打印
void Printlist(node** plist);
//4.单链表尾删
void Popback(node** plist);
//5.单链表的头插
void PushFront(node** plist, int x);
//6.单链表的头删
void PopFrount(node** plist);
//7.单链表的查找
node* Findpos(node* plist, int x);
//8.单链表在pos位置之后插入x
void Insertlinstafter(node* pos, int x);
//9.单链表删除pos位置之后的元素
void PopPosAfter(node* pos);
//10.单链表的销毁
void Destorylist(node** plist);
//1.动态申请节点
node*  Creatnode(int x) {
	node* t = (node*)malloc(sizeof(node));
	if (t == NULL) {
		assert(0);
		return NULL;
	}
	else {
		t->next = NULL;
		t->data = x;
		return t;
	}
}
//2.单链表的尾插
void PushBack(node** plist, int x) {
	assert(plist);
	if (*plist == NULL) {
		*plist = Creatnode(x);
	}
	else {
		node* p = *plist;
		while (p->next) {
			p = p->next;
		}
		p->next = Creatnode(x);
	}
}
//3.单链表的打印
void Printlist(node** plist) {
	assert(plist);
	node* p =* plist;
	while (p) {
		printf("%d ", p->data);
		p = p->next;
	}
}
//4.单链表尾删
void Popback(node** plist) {
	assert(plist);
	if (*plist == NULL) {
		return NULL;
	}
	node* p = *plist;
	node* q = NULL;
	while (p->next) {
		q = p;
		p = p->next;
	}
	q->next =NULL;
	free(p);
}
//5.单链表的头插
void PushFront(node** plist, int x) {
	assert(plist);
	node* t = Creatnode(x);
	if (NULL == *plist) {
		*plist = t;
	}
	else {
		t->next = *plist;
		*plist = t;
	}
}
//6.单链表的头删
void PopFrount(node** plist) {
	assert(plist);
	if (plist == NULL) {
		return NULL;
	}
	else {
		node* p = *plist;
		*plist = p->next;
		free(p);
	}
}
//7.单链表的查找
node* Findpos(node* plist, int x) {
	node* cur = plist;
	while (cur) {
		if (cur->data == x) {
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
//8.单链表在pos位置之后插入x
void Insertlinstafter(node* pos, int x) {
	assert(pos);
	if (NULL == pos) {
		return ;
	}
	node* t = Creatnode(x);
	t->next = pos->next;
	pos->next = t;
}
//9.单链表删除pos位置之后的元素
void PopPosAfter(node* pos) {
	assert(pos);
	if (pos->next == NULL) {
		return;
	}
	else{
		node* p = pos->next;
		pos->next = p->next;
		free(p);
	}
}
//10.单链表的销毁
void Destorylist(node** plist) {
	assert(plist);
	node* p = *plist;
	while (p) {
		*plist = p->next;
		free(p);
		p = *plist;
	}
	*plist = NULL;
}
 
void test1() {
	node* plist=NULL;//创建头指针
	PushBack(&plist, 1);//尾插元素
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PushBack(&plist, 5);
	Printlist(&plist);//打印链表元素  1 2 3 4 5 
	printf("\n");
	Popback(&plist); //尾删元素      
	PushFront(&plist, 0);//首插元素0    
	Printlist(&plist);//打印链表   0 1 2 3 4
	printf("\n");
	PopFrount(&plist);//首删元素0  
	Printlist(&plist);//打印链表   1 2 3 4
	printf("\n");
	Findpos(plist,1);//寻找链表中1的地址,不方便演示,下面会演示
	Insertlinstafter(Findpos(plist, 4), 5);//在4后面插入5,用到上面的Findpos函数
	Printlist(&plist);//打印链表   1 2 3 4 5
	printf("\n");
	PopPosAfter(Findpos(plist, 4));//删除指定位置后面的元素(删除4后面的5)
	Printlist(&plist);//打印链表    1 2 3 4
	printf("\n");
	Destorylist(&plist);//销毁链表
	Printlist(&plist);//打印链表
}
void test() {
	test1();
}
int main() {
	test();
	return 0;
}

3.测试结果:

a.先创建了头指针plist

b.尾插1 2 3 4 5

c. 尾删元素5

d.首插元素0

e.首删元素0

f.在元素4 后面插入5

g.删除4元素后面的5

h.销毁链表

到此这篇关于C语言实现单链表的基本功能详解的文章就介绍到这了,更多相关单链表基本功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现文件版通讯录的代码分享

    C语言实现文件版通讯录的代码分享

    这篇文章主要为大家详细介绍了如何利用C语言实现一个文件版通讯录,主要运用了结构体,一维数组,函数,分支与循环语句等等知识,需要的可以参考一下
    2023-01-01
  • 详解C++编译器优化技术

    详解C++编译器优化技术

    现代编译器缺省会使用RVO(return value optimization,返回值优化)、NRVO(named return value optimization、命名返回值优化)和复制省略(Copy elision)技术,来减少拷贝次数来提升代码的运行效率。
    2021-06-06
  • C语言实现的循环单链表功能示例

    C语言实现的循环单链表功能示例

    这篇文章主要介绍了C语言实现的循环单链表功能,结合实例形式分析了基于C语言实现的循环单链表定义、创建、添加、删除、打印、排序等相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • C语言结构体成员赋值的深拷贝与浅拷贝详解

    C语言结构体成员赋值的深拷贝与浅拷贝详解

    C语言中的浅拷贝是指在拷贝过程中,对于指针型成员变量只拷贝指针本身,而不拷贝指针所指向的目标,它按字节复制的。深拷贝除了拷贝其成员本身的值之外,还拷贝成员指向的动态内存区域内容。本文将通过示例和大家详细说说C语言的深拷贝与浅拷贝,希望对你有所帮助
    2022-09-09
  • C语言的数据变量、常量、数据类型及使用示例详解

    C语言的数据变量、常量、数据类型及使用示例详解

    本文介绍了C语言中的变量、常量、数据类型关键字以及如何使用这些数据类型,主要内容包括变量和常量的定义与使用、基本数据类型关键字,感兴趣的朋友一起看看吧
    2025-03-03
  • C++数据结构之搜索二叉树的实现

    C++数据结构之搜索二叉树的实现

    了解搜索二叉树是为了STL中的map和set做铺垫,我们所熟知的AVL树和平衡搜索二叉树也需要搜索二叉树的基础。本文将详解如何利用C++实现搜索二叉树,需要的可以参考一下
    2022-05-05
  • C++笔记之std::future的用法小结

    C++笔记之std::future的用法小结

    std::future通常由某个Provider创建,与std::async一起使用,本文主要介绍了C++笔记之std::future的用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • C++如何有效地利用命名空间

    C++如何有效地利用命名空间

    谈到C++编程中的模块化和组织性时,命名空间(Namespace)是一个重要的概念,所以本文主要来和大家聊聊C++命名空间的概念、用法以及如何有效地利用它来管理代码,有需要的可以参考下
    2023-09-09
  • C语言数组全面总结梳理

    C语言数组全面总结梳理

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-02-02
  • C++实现将s16le的音频流转换为float类型

    C++实现将s16le的音频流转换为float类型

    这篇文章主要为大家详细介绍了如何利用C++实现将s16le的音频流转换为float类型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-04-04

最新评论