单链表的基本操作

首先定义头文件,与单链表的基本结构:LinkList.h单元

#include <stdlib.h>
#include <assert.h>
typedef int DataType;
typedef struct LinkNode
{ 
	DataType data;
	struct LinkNode *next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
	LinkNode *pHead;
}LinkList,*pLinkList;
void InitLinkList(pLinkList pList);//初始化
void DestroyList(pLinkList pList);//销毁
void PushBack(pLinkList pList,DataType x);//尾插
void PopBack(pLinkList pList);//尾删
void PushFront(pLinkList pList,DataType x);//头插
void PopFront(pLinkList pList);//头删
void PrintList(pLinkList pList);//打印
pLinkNode Find(pLinkList pList,DataType x);//查找指定结点地址返回
void Erase(pLinkList pList,pLinkNode pos);//删除指定位置结点
void Insert(pLinkList pList,pLinkNode pos,DataType x);//在指定位置插入结点
void Remove(pLinkList pList,DataType x);//删除指定结点
void RemoveAll(pLinkList pList,DataType x);//全删
void Bubblesort(pLinkList pList);//排序
//面试题链表
void EraseNotTail(pLinkNode pos);//删除无头非尾结点的指定位置结点
void RerverseList(pLinkList pList);//反转(逆序)链表
void InsertFrontNode(pLinkNode pos,DataType x);//在当前结点前插入一个结点(无头结点)
pLinkNode FindMidNode(pLinkList pList);//寻找中间结点返回一个地址
void DelkNode(pLinkList pList,int k);//删除倒数第k个结点
#endif //_LINKLIST_H__

在源文件中,主函数中对其调节测试的过程:test.c单元

#include "LinkList.h"
void test1()
{
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,4);
	PushBack(&mylist,5);
	PushBack(&mylist,6);
	PrintList(&mylist);
	PopBack(&mylist);
	PrintList(&mylist);
	PopBack(&mylist);
	PrintList(&mylist);
	DestroyList(&mylist);
}
void test2()
{
	LinkList mylist;
	InitLinkList(&mylist);
	PushFront(&mylist,1);
	PushFront(&mylist,2);
	PushFront(&mylist,3);
	PushFront(&mylist,4);
	PushFront(&mylist,5);
	PushFront(&mylist,6);
	PrintList(&mylist);
	PopFront(&mylist);
	PrintList(&mylist);
	PopFront(&mylist);
	PrintList(&mylist);
	DestroyList(&mylist);
}
void test3()
{
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,4);
	PushBack(&mylist,5);
	PushBack(&mylist,6);
	PrintList(&mylist);
	Insert(&mylist,Find(&mylist,4),7);
	PrintList(&mylist);
	Insert(&mylist,Find(&mylist,7),8);
	PrintList(&mylist);
    Erase(&mylist,Find(&mylist,3));
    PrintList(&mylist);
	Erase(&mylist,Find(&mylist,1));
    PrintList(&mylist);
	DestroyList(&mylist);
}
void test4()
{
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,1);
	PushBack(&mylist,4);
	PushBack(&mylist,5);
	PushBack(&mylist,6);
	PushBack(&mylist,1);
	PrintList(&mylist);
    Remove(&mylist,4);
	PrintList(&mylist);
	Remove(&mylist,1);
	PrintList(&mylist);
    RemoveAll(&mylist,1);
	PrintList(&mylist);
	DestroyList(&mylist);
}
void test5()
{
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,7);
	PushBack(&mylist,6);
	PushBack(&mylist,5);
	PushBack(&mylist,4);
	PushBack(&mylist,3);
	PushBack(&mylist,2);
	PushBack(&mylist,1);
	PrintList(&mylist);
    Bubblesort(&mylist);
	PrintList(&mylist);
	DestroyList(&mylist);
}
void test6()
{
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,4);
	PushBack(&mylist,5);
	PushBack(&mylist,6);
	PrintList(&mylist);
	EraseNotTail(Find(&mylist,4));
	PrintList(&mylist);
	RerverseList(&mylist);
	PrintList(&mylist);
	RerverseList(&mylist);
	PrintList(&mylist);
	InsertFrontNode(Find(&mylist,5),4);
	PrintList(&mylist);
	DestroyList(&mylist);
}
void test7()
{
	pLinkNode ret;
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,4);
	PushBack(&mylist,5);
	PrintList(&mylist);
	ret=FindMidNode(&mylist);
	printf("%d\n",ret->data);

}
void test8()
{
	pLinkNode ret;
	LinkList mylist;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
	PushBack(&mylist,2);
	PushBack(&mylist,3);
	PushBack(&mylist,4);
	PushBack(&mylist,5);
	PrintList(&mylist);
	DelkNode(&mylist,6);
	PrintList(&mylist);
}
int main()
{
	test1();
	test2();
	test3();
	test4();
	test5();
	test6();
	test7();
	test8();
	system("pause");
	return 0;
}

在源文件中对其链表各种基本操作的具体代码实现:LinkList.c单元

#include"LinkList.h"
void InitLinkList(pLinkList pList)//初始化
{
	assert(pList);
	pList->pHead=NULL;
}
pLinkNode BuyNode(DataType x)//创建新结点
{
	pLinkNode newNode=(pLinkNode)malloc(sizeof(LinkNode));
	if(NULL==newNode)
	{
		printf("out of memory\n");
		exit(EXIT_FAILURE);
	}
	newNode->data=x;
	newNode->next=NULL;
	return newNode;
}
void PushBack(pLinkList pList,DataType x)//尾插
{
	pLinkNode newNode=NULL;
	assert(pList);
	newNode=BuyNode(x);
	if(NULL==pList->pHead)//空链表
	{
		pList->pHead=newNode;
	}
	else//不为空链表
	{
		pLinkNode cur=pList->pHead;
		while(NULL!=cur->next)
		{
			cur=cur->next;
		}
		cur->next=newNode;
	}
}
void PrintList(pLinkList pList)//打印
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		printf("%d->",cur->data);
		cur=cur->next;
	}
	printf("over\n");
}
void DestroyList(pLinkList pList)//销毁
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		pLinkNode del=cur;
		cur=cur->next;
		free(del);
		del=NULL;
	}
	pList->pHead=NULL;
	printf("销毁完成\n");
}
void PopBack(pLinkList pList)//尾删
{
	pLinkNode cur=NULL;
	pLinkNode prev=NULL;
	assert(pList);
	if(NULL==pList->pHead)//空链表
	{
		return;
	}
	else if(NULL==pList->pHead->next)//有一个结点
	{
		free(pList->pHead);
		pList->pHead=NULL;
	}
	else//两个以上结点
	{
		cur=pList->pHead;
		while(cur->next)
		{
			prev=cur;
			cur=cur->next;
		}
		free(cur);
		cur=NULL;
		prev->next=NULL;
	}
}
void PushFront(pLinkList pList,DataType x)//头插
{
	pLinkNode newNode=NULL;
	assert(pList);
	newNode=BuyNode(x);
	newNode->next=pList->pHead;
	pList->pHead=newNode;
}
void PopFront(pLinkList pList)//头删
{
	if(NULL==pList->pHead)//空链表
	{
		return;
	}
	else//非空链表
	{
		pLinkNode del=pList->pHead;
		pList->pHead=pList->pHead->next;
		free(del);
		del=NULL;
	}
}
pLinkNode Find(pLinkList pList,DataType x)//查找一个结点地址返回
{
	pLinkNode cur=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		if(cur->data==x)
		{
			return cur;
		}
		cur=cur->next;
	}
	return;
}
void Insert(pLinkList pList,pLinkNode pos,DataType x)//在结点4之后插入结点7
{
	pLinkNode newNode=NULL;
	assert(pList);
	if(pos==NULL)
	{
		return;
	}
	newNode=BuyNode(x);
	newNode->next=pos->next;
	pos->next=newNode;
}
void Erase(pLinkList pList,pLinkNode pos)//删除指定位置结点
{
	pLinkNode cur=NULL;
	pLinkNode del=NULL;
	pLinkNode prev=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		if(cur==pos)
		{
			if(cur==pList->pHead)
			{
				del=cur;
				pList->pHead=cur->next;
				free(del);
				del=NULL;
			}
			else
			{
				del=cur;
				prev->next=cur->next;
				free(del);
				del=NULL;
			}
			return;
		}
		else
		{
			prev=cur;
			cur=cur->next;
		}
	}
}
void Remove(pLinkList pList,DataType x)//删除指定结点
{
	pLinkNode cur=NULL;
	pLinkNode del=NULL;
	pLinkNode prev=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		if(cur->data==x)
		{
			if(cur==pList->pHead)
			{
				del=cur;
				pList->pHead=cur->next;
				free(del);
				del=NULL;
			}
			else
			{
				del=cur;
				prev->next=cur->next;
				free(del);
				del=NULL;
			}
			return;
		}
		else
		{
			prev=cur;
			cur=cur->next;
		}
	}
}
void RemoveAll(pLinkList pList,DataType x)//删除出现的所有指定结点
{
	pLinkNode cur=NULL;
	pLinkNode del=NULL;
	pLinkNode prev=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		if(cur->data==x)
		{
			if(cur==pList->pHead)
			{
				del=cur;
				pList->pHead=cur->next;
				free(del);
				del=NULL;
			}
			else
			{
				del=cur;
				prev->next=cur->next;
				free(del);
				del=NULL;
			}
			cur=cur->next;
		}
		else
		{
			prev=cur;
			cur=cur->next;
		}
	}
}
void Bubblesort(pLinkList pList)//冒泡排序
{
	pLinkNode cur=NULL;
	pLinkNode tail=NULL;
	assert(pList);
	cur=pList->pHead;
	if((pList->pHead==NULL)||(pList->pHead->next==NULL))
	{
		return;
	}
	while(cur!=tail)
	{
		while(cur->next!=tail)
			{
				if((cur->data)>(cur->next->data))
				{
					DataType tmp=cur->data;
					cur->data=cur->next->data;
				    cur->next->data=tmp;
				}
			cur=cur->next;
		    }
		tail=cur;
		cur=pList->pHead;
	}
}
//面试题链表
void EraseNotTail(pLinkNode pos)//删除无头非尾结点的指定位置结点
{
	pLinkNode del=NULL;
	assert(pos->next!=NULL);
	del=pos->next;
	pos->data=pos->next->data;
	pos->next=pos->next->next;
	free(del);
	del=NULL;
}
void RerverseList(pLinkList pList)//反转(逆序)链表
{
	pLinkNode cur=NULL;
	pLinkNode tmp=NULL;
	pLinkNode newHead=NULL;
	assert(pList);
	cur=pList->pHead;
	while(cur)
	{
		tmp=cur;
		cur=cur->next;
		tmp->next=newHead;
		newHead=tmp;
	}
	pList->pHead=newHead;
}
void InsertFrontNode(pLinkNode pos,DataType x)//在当前结点前插入一个结点(无头结点)
{
	DataType tmp=0;
	pLinkNode newHead=BuyNode(x);
	newHead->next=pos->next;
	pos->next=newHead;
	tmp=pos->data;
	pos->data=newHead->data;
	newHead->data=tmp;
}
pLinkNode FindMidNode(pLinkList pList)//寻找中间结点返回一个地址
{
	pLinkNode slow=NULL;
	pLinkNode fast=NULL;
	assert(pList);
	slow=pList->pHead;
	fast=pList->pHead;
	while((fast!=NULL)&&(fast->next!=NULL))
	{
		slow=slow->next;
		fast=fast->next->next;
	}
	return slow;
}
void DelkNode(pLinkList pList,int k)//删除倒数第k个结点
{
	pLinkNode front=NULL;
	pLinkNode back=NULL;
	DataType i=0;
	assert(pList);
	front=pList->pHead;
	back=pList->pHead;
	if(pList->pHead==NULL)
	{
		return;
	}
	for(i=1;i<=k-1;i++)
	{
		front=front->next;
	}
	while((front!=NULL)&&(front->next!=NULL))
	{
		front=front->next;
		back=back->next;
	}
	Erase(pList,back);
}


以上为对于单链表的各种实现操作...........

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值