c语言实现链表及其基本操作

介绍

       链表是一种物理储存单元上非连续、非顺序的储存结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。


和顺序表的区别:

     顺序表使用数组存储线形的元素,其特点是可以随机存取,但是,因为逻辑上相邻的元素物理上也相邻,所以插入删除需要移动元素。链表使用指针链表示线形表元素的逻辑关系,插入和删除只需修改指针,不能随机存取。

代码实现

typedef int DataType;
typedef struct Node
{//结构实现
	DataType data;
	struct Node* next;   
}Node, *PNode;


void InitList(PNode* PHead)//初始化
{
	assert(PHead);
	*PHead = NULL;
}

PNode ByeNode(DataType data)//申请一个结点
{
	PNode newNode = NULL;
	newNode = (PNode)malloc(sizeof(Node));
	if (NULL == newNode)
	{
		printf("out of memory.\n");
		exit(1);
	}
	else
	{
		newNode->data = data;
		newNode->next = NULL;
	}
	return newNode;
}
void PopBack(PNode* PHead)//尾删
{
	assert(PHead);
	if (NULL == *PHead)
	{
		return;
	}
	else if(NULL == (*PHead)->next)
	{
		PNode TempNode = *PHead;
		free(TempNode);
		TempNode = NULL;
		*PHead = NULL;
	}
	else
	{
		PNode PCur = *PHead;
		while (PCur->next->next)
		{
			PCur = PCur->next;
		}
		PCur->next = NULL;
	}
}

void PushBack(PNode* PHead, DataType data)//尾插
{
	assert(PHead);
	if (NULL == *PHead)
	{
		*PHead = ByeNode(data);
	}
	else
	{
		PNode PCur = NULL;
		PCur = *PHead;
		while (PCur->next)
		{
			PCur = PCur->next;
		}
		PCur->next = ByeNode(data);
	}
}

void PushFront(PNode *PHead, DataType data)//头插
{
	assert(PHead);
	PNode PreNode = NULL;
	PNode Node = ByeNode(data);
	PreNode = *PHead;
	Node->next = PreNode;
	*PHead = Node;
}

void PopFront(PNode *PHead)//头删
{
	assert(PHead);
	PNode PreNode = *PHead;
	if (NULL == *PHead)
	{
		return;
	}
	else if (NULL == (*PHead)->next)
	{
		*PHead = NULL;
	}
	else
	{
		*PHead = PreNode->next;
		free(PreNode);
		PreNode = NULL;
	}
}


PNode Find(PNode* PHead, DataType data)//查找
{
	assert(PHead);
	PNode PCur = *PHead;
	while (PCur)
	{
		if (data == PCur->data)
			break;
		PCur = PCur->next;
	}
	return PCur;
}

void Destroy(PNode* PHead)//销毁
{
	assert(PHead);
	PNode PCur = *PHead;
	while (PCur->next)
	{
		PNode Dnode = PCur;
		PCur = PCur->next;
		free(Dnode);
		Dnode = NULL;
	}
}

int Empty(PNode PHead)//判空
{
	if (NULL == PHead)
		return 0;
	else
		return 1;
}

int Size(PNode PHead)//求链表中结点的个数
{ 
	PNode Node = PHead;
	DataType num = 0;
	while (Node)
	{
		num++;
		Node = Node->next;
	}
	return num;
}

void PrintList(PNode* PHead)//打印单链表
{
	PNode PCur = *PHead;
	assert(PHead);
	while (PCur)
	{
		printf("%d->",PCur->data);
		PCur = PCur->next;
	}
	printf("NULL\n");
}

void Insert(PNode pos, DataType data)//在data后插入结点
{
	PNode newNode = ByeNode(data);
	PNode PreNode = pos;
	newNode->next = PreNode->next;
	PreNode->next = newNode;
}




  • 11
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值