链表基本操作(无头结点)


//头文件"hanshu shengming.h"
#pragma once
typedef int Datatype;
typedef struct LNode
{
	int val;
	struct LNode* next;
}LinkList;
//动态申请节点
LinkList* BuyLNode(Datatype x);
//打印
void PrintList(LinkList* plist);
//尾插
void TailInsert(LinkList** plist,Datatype x);
//头插
void HeadInsert(LinkList** plist, Datatype x);
//尾删
void TailDele(LinkList** plist);
//头删
void HeadDele(LinkList** plist);
//查找
LinkList* Find(LinkList* plist, Datatype x);
//在指定位置pos(地址)后插入X
void Insertafter(LinkList* pos, Datatype x);
//删指定位置pos后的值
void Deleafter(LinkList* pos);
//销毁
void Destroy(LinkList** plist);
//统计链表元素个数
int Count(LinkList* p);

void Test();
//实现操作函数"functionrealize.c"
#define  _CRT_SECURE_NO_WARNINGS
#include"hanshu shengming.h"
#include<stdio.h>
#include<stdlib.h>
//动态申请节点
LinkList* BuyLNode(Datatype x)
{
	LinkList* newnode = (LinkList*)malloc(sizeof(LinkList));//动态分配空间
	if (newnode == NULL)//分配失败
	{
		exit(0);
	}
	newnode->val = x;
	newnode->next = NULL;
	return  newnode;
}
//打印
void PrintList(LinkList* plist)
{
	LinkList* p = plist;
	while (p)
	{
		printf("%d——>", p->val);
		p = p->next;
	}
	printf("NULL\n");
}
//尾插
void TailInsert(LinkList** plist, Datatype x)
{
	
	if (*plist == NULL)//空表
	{
		*plist = BuyLNode(x);
	}
	else
	{
		LinkList* tail = *plist;
		while (tail->next)//找到最后一个节点
		{
			tail = tail->next;
		}
		tail->next = BuyLNode(x);
	}
}
//头插
void HeadInsert(LinkList** plist, Datatype x)
{
	LinkList* newnode=BuyLNode(x);//创造一个节点
	newnode->next = *plist;
	*plist = newnode;
	
}
//尾删
void TailDele(LinkList** plist)
{
	LinkList* p = *plist;
	if (*plist == NULL)//空表
	{
		return;
	}
	else if (p->next == NULL)//只有一个节点
	{
		free(p);
		p = NULL;
		return;
	}
	else
	{
		while (p->next->next != NULL)
		{
			p = p->next;
		}
		free(p->next);
		p->next = NULL;
	}

}

//头删
void HeadDele(LinkList** plist)
{
	if (*plist == NULL)//空表
	{
		return;
	}
	else if ((*plist)->next == NULL)//只有一个节点
	{
		free(*plist);
		*plist = NULL;
		return;
	}
	else
	{
		LinkList* cur = *plist;
		*plist = cur->next;
		free(cur);
		cur = NULL;
		return;
	}

}
//查找
LinkList* Find(LinkList* plist, Datatype x)
{
	LinkList* p = plist;
	while (p && p->val != x)
	{
		p = p->next;
	}
	if (p)
		return p;
	else
		printf("查找失败");
}
//在指定位置pos(地址)后插入X
void Insertafter(LinkList* pos, Datatype x)
{
	LinkList* newnode = BuyLNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}
//删指定位置pos后的值
void Deleafter(LinkList* pos)
{
	if (pos == NULL||pos->next==NULL)//空表或只有一个节点,即没有可删除的节点
	{
		return;
	}
	else
	{
		LinkList* p = pos->next;
		pos->next = p->next;
		free(p);
		p = NULL;
	}
}
//销毁
void Destroy(LinkList** plist)
{
	LinkList* p = *plist;
	while (p)
	{
		*plist = p->next;
		free(p);
		p = *plist;
	}
	*plist = NULL;
}
//统计
int Count(LinkList* p)
{
	int x=0;
	while (p != NULL)
	{
		x++;
		p = p->next;
	}
	return x;
}

void Test()
{
	LinkList* s = NULL;//不带头结点的单链表
	
	int i=0;
	HeadInsert(&s, 1);
	HeadInsert(&s, 2);
	HeadInsert(&s, 3);
	HeadInsert(&s, 9);
	PrintList(s);
	/*TailDele(&s);//测试尾删
	PrintList(s);
	TailDele(&s);
	PrintList(s);
	TailDele(&s);
	PrintList(s);*/
	/*HeadDele(&s);//测试头删
	PrintList(s);
	HeadDele(&s);
	PrintList(s);*/
	LinkList* s1 = NULL;
	s1 = Find(s, 3);//查找
	printf("%d\n", s1->val);
	Insertafter(s1, 11);//指定位置后插入
	Insertafter(s1, 12);
	PrintList(s);
	Deleafter(s1);//指定位置后删除
	PrintList(s);
	i = Count(s);//统计个数
	printf("%d\n", i);
	Destroy(&s);//销毁
	PrintList(s);
}
#define  _CRT_SECURE_NO_WARNINGS
#include"functionrealize.c"
int main()
{
	Test();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值