C语言实现手写链表

头文件

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#ifdef _cplusplus{
#endif
//创建一个节点
struct Linknode {
	int data;
	struct Linknode* next;
};
//初始化链表
struct Linknode* Inint_Linklist();
//在链表中值oldval处插入新数据newval;
void Insertbyvalue_linklist(struct Linknode* header, int oldval, int newval);
//遍历链表
void print_Linklist(struct Linknode* header);
//删除值为val的结点
void removebyvalue_linklist(struct Linknode* header, int delvalue);
//清空链表
void clear_Linklist(struct Linknode* header);
//销毁链表
void destroy_Linklist(struct Linknode* header);
#ifdef _cplusplus
}
#endif

源文件:Linklist.c

#include <stdio.h>
#include <string.h>
#include "LinkList.h"
//初始化链表
struct Linknode* Inint_Linklist()
{
	//创建一个头结点
	struct Linknode *header= malloc(sizeof(struct Linknode));
	if (header == NULL)
	{
		printf("堆内存开辟失败!\n");
		exit(0);
	}
	header->data = -1;
	header->next = NULL;
	//创建一个尾指针
	struct Linknode* prear = header;
	//定义用户输入的值
	int val = -1;
	while (true)
	{
		printf("请输入您需要插入的值:\n");
		int reval=scanf_s("%d", &val);
		if (val == -1)
		{
			break;
		}
		//为输入的值创建一个新的结点
		struct Linknode* newnode = malloc(sizeof(struct Linknode));
		newnode->data = val;
		newnode->next = NULL;
		//将新结点插入到链表的尾部
		prear->next = newnode;
		prear = newnode;
	}
	return header;
}
//在链表中值oldval处插入新数据newval;
void Insertbyvalue_linklist(struct Linknode* header, int oldval, int newval)
{
	//创建两个辅助指针
	struct Linknode* pPrev = header;
	struct Linknode* pcurrent = pPrev->next;
	//若链表为空。程序结束
	if (header == NULL)
	{
		return;
	}
	while (pcurrent != NULL)
	{
		if (pcurrent->data == oldval)
		{
			break;
		}
		pPrev = pcurrent;
		pcurrent = pcurrent->next;
	}
	if (pcurrent == NULL)
	{
		return;
	}
	//找到oldval对应的位置后,创建一个新的结点,并将其插入链表中;
	struct Linknode* newnode = malloc(sizeof(struct Linknode));
	//初始化新的结点
	newnode->data = newval;
	newnode->next = NULL;
	//将新的结点插入到链表中
	pPrev->next = newnode;
	newnode->next = pcurrent;
}
//遍历链表
void print_Linklist(struct Linknode* header)
{
	if (header == NULL)
	{
		return;
	}
	struct Linknode* pcurrent = header->next;
	while (pcurrent != NULL)
	{
		printf("%d\t", pcurrent->data);
		pcurrent = pcurrent->next;
	}
	printf("\n");
}
//删除值为val的结点
void removebyvalue_linklist(struct Linknode* header, int delvalue)
{
	//创建两个辅助指针
    struct Linknode* pPrev = header;
	struct Linknode* pcurrent = pPrev->next;
	if (header == NULL)
	{
		return;
	}
	while (pcurrent != NULL)
	{
		if (pcurrent->data == delvalue)
		{
			break;
		}
		pPrev = pcurrent;
		pcurrent = pcurrent->next;
	}
	if (pcurrent == NULL)
	{
		return;
	}
	pPrev->next=pcurrent->next;
	free(pcurrent);
	pcurrent = NULL;
}
//清空链表
void clear_Linklist(struct Linknode* header)
{
	if (header == NULL)
	{
		return;
	}
	//创建一个辅助指针
	struct Linknode* pcurrent = header->next;
	while (pcurrent != NULL)
	{
		//创建一个新节点用来保存写一个结点的地址
		struct Linknode* pnext = pcurrent->next;
		//释放当前节点内存空间
		free(pcurrent);
		//更新pcurrent的指向
		pcurrent = pnext;
	}
	header->next = NULL;
}
//销毁链表
void destroy_Linklist(struct Linknode* header)
{
	if (header == NULL)
	{
		return;
	}
	//创建一个辅助指针
	struct Linknode* pcurrent = header;
	while (pcurrent != NULL)
	{
		//创建一个新节点用来保存写一个结点的地址
		struct Linknode* pnext = pcurrent->next;
		//释放当前节点内存空间
		free(pcurrent);
		//更新pcurrent的指向
		pcurrent = pnext;
	}
}

 测试

#include <stdio.h>
#include "LinkList.h"
#include <string.h>
#include <stdlib.h>
void test()
{

	struct Linknode* header = Inint_Linklist();
	//打印链表
	print_Linklist(header);
	printf("----------------------------------\n");
	//插入数据
	Insertbyvalue_linklist(header, 400, 666);
	Insertbyvalue_linklist(header, 400, 667);
	Insertbyvalue_linklist(header, 400, 668);
	print_Linklist(header);
	printf("----------------------------------\n");
	//删除数据
	removebyvalue_linklist(header, 666);
	removebyvalue_linklist(header, 668);
	print_Linklist(header);
	printf("----------------------------------\n");
	//清空链表
	clear_Linklist(header);
	print_Linklist(header);
	printf("----------------------------------\n");
	//清空后的链表还可以继续初始化并插入数据
	header = Inint_Linklist();
	Insertbyvalue_linklist(header, 200, 888);
	Insertbyvalue_linklist(header, 200, 999);
	print_Linklist(header);
	printf("----------------------------------\n");
	//销毁链表
	destroy_Linklist(header);
}
int main()
{
	test();
	system("pause");
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值