实现单向链表的基本功能

</pre><p><span style="font-size:18px;">实现从前到后访问的单向链表</span></p><p><span style="font-size:24px;color:#3366ff;">LinkList.h</span><pre name="code" class="html"><span style="font-size:18px;">#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#include<stdio.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 PushBack(PLinkList PList,DataType x);
void PopBack(PLinkList PList);
void PushFront(PLinkList PList,DataType x);
void PopFront(PLinkList PList);
PLinkNode Find(PLinkList PList,DataType x);
void Insert(PLinkList PList,PLinkNode pos,DataType x);
void Remove(PLinkList PList,DataType x);
void PrintList(PLinkList PList);
void DestoryList(PLinkList PList);
void Erase(PLinkList PList,PLinkNode pos);
void BubbleSort(PLinkList PList);


#endif //__LINKLIST_H__</span>
LinkList.c

<span style="font-size:18px;">#include "LinkList.h"
void InitLinkList(PLinkList PList)     //初始化链表
{
   assert(PList);             //pHead可以为空,不能断言
   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 cur=NULL;
	PLinkNode newNode=NULL;
	assert(PList);
	newNode=BuyNode(x);
	if(NULL==PList->pHead)
	{
		PList->pHead=newNode;
		return;
	}
	else
	{
		cur=PList->pHead;   //cur指向头指针
		while(cur->next !=NULL)
		{
			cur=cur->next ;      //cur最后指向最后一个结点
		}
		cur->next =newNode;
	}
}
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)    //查找x,返回地址
{
	PLinkNode ret=PList->pHead ;
	assert(PList);
	if(NULL==PList->pHead )   //空链表
	{
		return NULL;
	}
	else  
	{
		while(ret)
		{
			if(ret->data==x)
			   return ret;
			ret=ret->next ;
		}
		return NULL;
	}
}
void Insert(PLinkList PList,PLinkNode pos,DataType x)   //在pos前插data=x的结点
{
	PLinkNode cur=PList->pHead ;
	PLinkNode newNode=NULL;
	assert(PList);
	assert(pos);
	newNode=BuyNode(x);
	if(cur==pos)          //在第一个结点之前插
	{
		PushFront(PList,x);    //直接使用头插的函数
	}
	while(cur)
	{
		if(cur->next ==pos)
		{
			cur->next=newNode;
			newNode->next =pos;
		}
		cur=cur->next ;
	}
}
void Remove(PLinkList PList,DataType x)     //删除data=x的结点
{
	PLinkNode cur=PList->pHead ;
	//PLinkNode del=NULL;
	PLinkNode prev=NULL;
	assert(PList);
	if(PList->pHead ==NULL)   //无结点
		return;
	if(cur->data ==x)       //删除第一个结点
	{
		PopFront(PList);
	}
	else 
	{
		while(cur&&(cur->data !=x))
	 {
		prev=cur;            //记住前一个结点
		cur=cur->next ;
	 }
		if(cur==NULL)
			return;       //找不到
		else
		{
			//del=cur;
			prev->next =cur->next ;
			free(cur);
		}
	}
}
void Erase(PLinkList PList,PLinkNode pos)      //删除地址是POS的结点
{
	PLinkNode cur=NULL;
	PLinkNode prev=NULL;
	assert(PList);
	cur=PList->pHead ;
	if(PList->pHead ==NULL)   //空链表
		return;
	if(cur==pos)    //第一个结点
		PopFront(PList);
	else
	{
		while(cur)
	  {
		if(cur==pos)
		{
			prev->next =cur->next ;
			free(cur);
			return;      //非常重要
		}
		else
		{
            prev=cur;
		    cur=cur->next ;
		}
		
	  }
	
	}
}
void BubbleSort(PLinkList PList)              //冒泡排序(升序)
{
	PLinkNode cur=PList->pHead ;
	PLinkNode tail=NULL;
	while(cur!=tail)       //外层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;      //第一次tail走到最后一个位置
		cur=PList->pHead ;
	}
}
void PrintList(PLinkList PList)
{
     PLinkNode cur=PList->pHead ;
     assert(PList);
	 while(cur!=NULL)
	 {
		 printf("%d->",cur->data);
		 cur=cur->next;
	 }
	 printf("over\n");
}
void DestoryList(PLinkList PList)
{
	 PLinkNode cur=PList->pHead ;
     assert(PList);
	 while(cur!=NULL)
	 {
		 PLinkNode del=cur;
		 cur=cur->next ;
		 free(del);
		 del=NULL;
	 }
	 PList->pHead =NULL;
}</span>
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); 
//    PrintList(&mylist);
//	PopBack(&mylist);
//	PrintList(&mylist);
//	PopBack(&mylist);
//	PrintList(&mylist);
//    DestoryList(&mylist);
//}
//void test2()
//{
//	LinkList mylist;
//	InitLinkList(&mylist);
//	PushFront(&mylist,1);
//    PushFront(&mylist,2);
//	PushFront(&mylist,3);
//	PushFront(&mylist,4);
//	PushFront(&mylist,5);
//	PrintList(&mylist);
//	PopFront(&mylist);
//	PrintList(&mylist);
//	PopFront(&mylist);
//	PrintList(&mylist);
//	PopFront(&mylist);
//	PrintList(&mylist);
//    DestoryList(&mylist);
//}
void test3()
{
	LinkList mylist;
	PLinkNode ret=NULL;
	InitLinkList(&mylist);
	PushBack(&mylist,1);
    PushBack(&mylist,3);
	PushBack(&mylist,2);
	PushBack(&mylist,5);
	PushBack(&mylist,4);
	PrintList(&mylist);
	//Insert(&mylist,Find(&mylist,3),6);
	//Insert(&mylist,Find(&mylist,1),6);
	//Remove(&mylist,1);
	//Erase(&mylist,Find(&mylist,3));
	BubbleSort(&mylist);
	PrintList(&mylist);
    DestoryList(&mylist);
}
int main()
{
	//test1();
	//test2();
	test3();
	system("pause");
	return 0;
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值