c语言 动态链表

linkList.h文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct LinkNode
{
	int num;
	struct LinkNode *next;
};


//初始化链表
extern struct LinkNode* init_LinkList(void);

//遍历链表内容
extern void foreach_LinkList(struct LinkNode *pHead);

//插入数据
extern void search_LinkList(struct LinkNode *pHead, int oldVal, int newVal);

//删除数据
extern void delete_LinkList(struct LinkNode *pHead,int value);

//清空数据
extern void clear_LinkList(struct LinkNode *pHead);

//销毁链表
extern void destroy_LinkList(struct LinkNode *pHead);

//反转链表
extern void reverse_LinkList(struct LinkNode *pHead);

//链表总长度
extern int size_LinkList(struct LinkNode *pHead);

//递归逆序遍历数据
extern void print_LinkList(struct LinkNode *pHead);

linkList.c文件

#include "linkList.h"

//初始化链表
struct LinkNode* init_LinkList(void)
{
	struct LinkNode *pHead = malloc(sizeof(struct LinkNode));
	if (pHead == NULL)
	{
		perror("malloc");
		return NULL;
	}

	pHead->next = NULL;

	int val = 0;
	struct LinkNode *pTail = pHead;
	while (1)
	{
		printf("输入-1结束输入:\n");
		scanf("%d", &val);

		if (val == -1)
			break;

		struct LinkNode *newNode = malloc(sizeof(struct LinkNode));
		newNode->num = val;
		newNode->next = NULL;

		//建立关系

		pTail->next = newNode;
		pTail = newNode;
	}
	return pHead;
}
//遍历链表内容
void foreach_LinkList(struct LinkNode *pHead)
{
	if (pHead == NULL)
		return;

	struct LinkNode *pCurrent = pHead->next;

	while (pCurrent != NULL)
	{
		printf("%d  ", pCurrent->num);
		pCurrent = pCurrent->next;
	}
	printf("\n");
	return;
}
//插入数据
void search_LinkList(struct LinkNode *pHead, int oldVal, int newVal)
{
	if (pHead == NULL)
		return;

	struct LinkNode * prev = pHead;
	struct LinkNode * pcur = pHead->next;

	while (pcur != NULL)
	{
		if (pcur->num == oldVal)//找到插入位置
		{
			break;
		}
		prev = pcur;
		pcur = pcur->next;
	}

	struct LinkNode *newNode = malloc(sizeof(struct LinkNode));
	newNode->num = newVal;
	newNode->next = NULL;

	newNode->next = pcur;
	prev->next = newNode;

	return;
}
//删除数据
void delete_LinkList(struct LinkNode *pHead, int delData)
{
	if (pHead == NULL)
		return;

	struct LinkNode * prev = pHead;
	struct LinkNode * pcur = pHead->next;

	while (pcur != NULL)
	{
		if (pcur->num == delData)//找到删除位置
		{
			break;
		}
		prev = pcur;
		pcur = pcur->next;
	}

	prev->next = pcur->next;
	free(pcur);
	return;
}
//清空数据
void clear_LinkList(struct LinkNode *pHead)
{
	if (pHead == NULL)
		return;

	struct LinkNode *prev = pHead->next;
	while (prev != NULL)
	{
		struct LinkNode *next = prev->next;

		free(prev);
		prev = next;
	}

	pHead->next = NULL;
	return;
}
//销毁链表
void destroy_LinkList(struct LinkNode *pHead)
{
	if (pHead == NULL)
		return;

	clear_LinkList(pHead);
    
	free(pHead);
	return; 
}
//反转链表
void reverse_LinkList(struct LinkNode *pHead)
{
	if (pHead == NULL)
		return;

	struct LinkNode *pPrve = NULL;
	struct LinkNode *pNext = NULL;
	struct LinkNode *pCurr = pHead->next;

	while (pCurr != NULL)
	{
		pNext = pCurr->next;
		pCurr->next = pPrve;
		pPrve = pCurr;
		pCurr = pNext;
	}
	pHead->next = pPrve;
	return;
}
//链表总长度
int size_LinkList(struct LinkNode *pHead)
{
	if (pHead == NULL)
		return;

	int size = 0;
	struct LinkNode *pCurr = pHead->next;
	while (pCurr != NULL)
	{
		++size;
		pCurr = pCurr->next;
	}
	return size;
}
//递归逆序遍历数据
void print_LinkList(struct LinkNode *pHead)
{
	if (pHead == NULL)
		return;

	print_LinkList(pHead->next);
	printf("%d  ", pHead->num);
}

main.c文件

#include"linkList.h"


void test01()
{
	struct LinkNode * pHead = init_LinkList();

	foreach_LinkList(pHead);

	search_LinkList(pHead, 10, 100);
	search_LinkList(pHead, 20, 200);
	search_LinkList(pHead, -1, 300);

	printf("插入数据后遍历结果:\n");
	foreach_LinkList(pHead);

	delete_LinkList(pHead, 300);

	printf("删除数据后遍历结果:\n");
	foreach_LinkList(pHead);

	clear_LinkList(pHead);
	printf("清空数据后遍历结果:\n");
	foreach_LinkList(pHead);
    
	//销毁链表
	destroy_LinkList(pHead);

	//printf("------------------:\n");
	//search_LinkList(pHead, 10, 100);
	//foreach_LinkList(pHead);

	return;
}
void test02()
{
	struct LinkNode * pHead = init_LinkList();
    
	printf("反转前:\n");
	foreach_LinkList(pHead);

	printf("反转后:\n");
	reverse_LinkList(pHead);
	foreach_LinkList(pHead);

	int size = size_LinkList(pHead);
	printf("链表长度:%d\n", size);

	return;
}
void test03()
{
	struct LinkNode * pHead = init_LinkList();
	foreach_LinkList(pHead);

	print_LinkList(pHead->next);
	printf("\n");

	return;
}
int main(int argc, char* argv[])
{
	test03();
	system("pause");
	return EXIT_SUCCESS;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值