基于链表(单链表,含头节点)的基本操作

下面是我对于链表的学习,依然是老生常谈的增删查改
LinkList.h //头文件

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int DataType;

typedef struct LinkList
{
	DataType data;
	struct LinkList * next;
}LinkList, *PLinkList;

PLinkList initLink()//初始化链表  一个有头节点的链表
{
	LinkList* p = (LinkList*)malloc(sizeof(LinkList));//创建一个头结点
	p->data = 0;//表示链表中的元素个数
	p->next = NULL;
	return p;
}

PLinkList CreateLink(PLinkList Link)//创建一个新节点
{
	PLinkList a = (PLinkList)malloc(sizeof(LinkList));
		a->next = NULL;
		a->data = 0;
		Link->data += 1;
		return a;
}

void LPushFront(PLinkList Link,DataType data)//头插
{
		PLinkList a = CreateLink(Link);
		a->next = Link->next;
		a->data = data;
		Link->next = a;
}



void LPushBack(PLinkList Link, DataType data)//尾插
{
	assert(Link);
	PLinkList cur = Link;
	PLinkList a = CreateLink(Link);
	a->data = data;
	a->next = NULL;
	while (cur->next != NULL)
	{
		cur = cur->next;
	}
	cur->next = a;
}



void LPopFront(PLinkList Link)//头删
{
	if (Link->next == NULL)
	{
		printf("链表已空\n");
		return;
	}
	else
	{
		PLinkList del = Link->next;
		Link->next = Link->next->next;
		Link->data -= 1;
		free(del);
		del = NULL;
	}
}

void LPopBack(PLinkList Link)//尾删
{
	PLinkList del = Link;
	if (del->next == NULL)
	{
		return;
	}
	else
	{
		while (del->next->next!=NULL)
		{
			del = del->next;
		}
		free(del->next->next);
		del->next = NULL;
	}

}



int SelectLinkList(PLinkList Link,DataType data)//查找某元素并返回其在链表中的位置
{
	int i = 0;
	for (PLinkList cur = Link; cur->next != NULL; cur = cur->next)
	{
		if (cur->data == data)
		{
			return i;
		}
		i += 1;
	}
	return -1;
}

void PInsertLinkList(PLinkList Link, int pos, DataType data)//插入在链表中
{
	PLinkList cur = Link;
	while (pos-1)
	{
		cur = cur->next;
		pos--;
	}
	PLinkList Ins = CreateLink(Link);
	Ins->next = cur->next->next;
	cur->next = Ins;
	Ins->data = data;
}

void PDelLinkList(PLinkList Link, int pos)//删除链表中的节点
{
	PLinkList del = Link;
	PLinkList tmp = Link;
	while (pos)
	{
		tmp = del;
		del = del->next;
		pos--;
	}
	tmp->next = del->next;
	free(del);
	del = NULL;
	Link->data -= 1;
}

void PRINTF(PLinkList Link)//输出链表
{
	PLinkList cur = Link;
	while (cur->next != NULL)
	{
		cur = cur->next;
		printf("%d-->", cur->data);
	}
	printf("NULL", cur->data);
}

void test()
{
	PLinkList p = initLink();
	LPushFront(p, 5);
	LPushFront(p, 4);
	LPushFront(p, 3);
	LPushFront(p, 2);
	LPushFront(p, 1);
	LPopFront(p);
	LPushBack(p, 6);
	LPopBack(p);
	PInsertLinkList(p, 2, 10);
	PDelLinkList(p, 3);
	PRINTF(p);
}

LinkList.c //主函数

#define _CRT_SECURE_NO_WARNINGS 1
#include"LinkList.h"

int main()
{
	test();
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值