单链表

LinkList.h

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef int DataType;
typedef struct LinkNode
{
	DataType _data;
	struct LinkNode* next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
	LinkNode* _pHead;
}LinkList,*pLinkList;

void Init_LinkList(pLinkList plist);
void Free_LinkList(pLinkList plist);
void Push_Back(pLinkList plist, DataType data);//尾插
void Pop_Back(pLinkList plist);                 //尾删
void Push_Front(pLinkList plist, DataType data);//头插 
void Pop_Front(pLinkList plist);                  //头删
void Print_LinkList(pLinkList plist);               //打印
pLinkNode Find_NUM(pLinkList plist, DataType data);  //找指定节点
void Insert_Back(pLinkList plist, pLinkNode pos, DataType data);//当前结点后插入
void Insert_Front(pLinkList plist, pLinkNode pos, DataType data);//当前节点前插入
void Remove_LinkList(pLinkList plist, DataType data);//删除指定元素
void Remove_all(pLinkList plist, DataType data);   //删除所有指定元素
void Bubble_Sort(pLinkList plist);            //排序
void Erase_LinkList(pLinkList plist, pLinkNode pos);//删除指定位置元素
LinkListFun.h

#include"LinkList.h"

void Init_LinkList(pLinkList plist)
{
	assert(plist);
	plist->_pHead = NULL;
	//plist->_pHead->next = NULL;
}
void Free_LinkList(pLinkList plist)
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode tmp = NULL;
	while (cur)
	{
		tmp = cur;
		free(tmp);
		cur = cur->next;
	}
	plist->_pHead = NULL;
}
pLinkNode creatN(DataType data)
{
	pLinkNode newNode = (pLinkNode)malloc(sizeof(LinkList));
	if (NULL == newNode)
	{
		printf("out of memory");
		exit(EXIT_FAILURE);
	}
	newNode->_data = data;
	newNode->next = NULL;
	return newNode;
}
void Push_Back(pLinkList plist, DataType data)//尾插
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode newNode = creatN(data);
	if (cur== NULL)//空
	{
		plist->_pHead  = newNode;
		return;
	}
	else
	{
		while (cur->next)
		{
			cur = cur->next;
		}
		cur->next = newNode;
	}
	
}
void Pop_Back(pLinkList plist)//尾删
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode tmp = NULL;
	if (cur== NULL)//
	{
		printf("空链表\n");
		return;
	}
	else if (plist->_pHead ->next == NULL)			//错误多发
	{												
		plist->_pHead = NULL;						
													
		free(plist->_pHead);						
		return;										
	}												
	else											
	{												
		while (cur->next->next )					
		{											
			//tmp = cur;							
			cur = cur->next;						
		}											
		cur->next = NULL;							
		free(cur->next);                            //
		
	}
}
void Push_Front(pLinkList plist, DataType data)//头插 
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode newNode = creatN(data);
	newNode->next = cur;
	plist->_pHead = newNode;
	//cur->next = newNode;
}
void Pop_Front(pLinkList plist)                  //头删
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	plist->_pHead  = cur->next;

}
void Print_LinkList(pLinkList plist)//打印
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	while (cur)									  
	{											  
		printf("%d->", cur->_data);				  
		cur = cur->next;						  
	}
	printf("NULL\n");
}
pLinkNode Find_NUM(pLinkList plist, DataType data)  //找指定节点
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	while (cur)
	{
		if (cur->_data == data)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
void Insert_Back(pLinkList plist, pLinkNode pos, DataType data)//当前结点后插入
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode tmp = NULL;
	pLinkNode newNode = creatN(data);
	while (cur == pos)
	{
		cur = cur->next;
	}
	newNode->next = cur->next;
	cur->next =newNode;
}
void Insert_Front(pLinkList plist, pLinkNode pos, DataType data)//当前节点前插入
{

	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode tmp = NULL;
	pLinkNode newNode = creatN(data);
	if (cur == pos)
	{
		newNode->next = cur;
		plist->_pHead= newNode;
		return;
	}
	cur = cur->next;
	while (cur  != pos)
	{
		tmp = cur;
		cur = cur->next;
	}

	newNode->next = cur;
	tmp ->next = newNode;
}
void Remove_LinkList(pLinkList plist, DataType data)//删除指定元素
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode tmp = NULL;
	while (cur)
	{
		if (cur->_data == data)//第一个元素为要删除元素
		{
			tmp = cur;
			plist->_pHead = tmp->next;
			//cur = NULL;
			/*tmp = NULL;
			free(tmp);*/
			break;
		}
		if (cur->next ->_data == data)
		{
			tmp = cur->next;
			cur->next = tmp->next;
			break;
		}
		cur = cur->next;

	}
	tmp= NULL;
	free(tmp);

}
void Remove_all(pLinkList plist, DataType data)   //删除所有指定元素
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode tmp = NULL;
	if (cur->_data == data)//第一个元素为要删除元素
	{
		tmp = cur;
		plist->_pHead = tmp->next;
		tmp = NULL;
		free(tmp);
	}
	cur = cur->next;
	while (cur)
	{
		if (cur->next->next == NULL)//最后一个元素为要删除元素
		{
			tmp = cur->next;
			tmp = NULL;
			free(tmp);
			break;
		}
		if (cur->next ->_data == data)
		{
			
			tmp = cur->next;
			cur->next = tmp->next;
			tmp = NULL;
			free(tmp);
			
		}
		cur = cur->next;

	}
}
int Len(pLinkList plist)
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	int count = 0;
	while (cur)
	{
		cur = cur->next;
		count++;
	}
	return count;
}
void Bubble_Sort(pLinkList plist)           //排序
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	pLinkNode cur1 = NULL;
	DataType tmp =0;
	int count = 0;
	int size = Len(plist);
	while (cur)//冒泡排序用链表的大小来控制排序次数
	{
		if (size == 1)
			return;
		cur1 = cur;
		count = 1;
		while (cur1->next )
		{
		
			if (count == size)
				break;
			if (cur1->_data > cur1->next->_data)
			{
				tmp  = cur1->next->_data;
				cur1->next->_data = cur1->_data;
				cur1->_data = tmp;
				
			}
			cur1 = cur1->next;
			count++;  //内部循环次数
		}
		size--;//每循环一次 外部循环剪掉最后一个数
		//cur = cur->next;
	}
}
void Erase_LinkList(pLinkList plist, pLinkNode pos)//删除指定位置元素
{
	assert(plist);
	pLinkNode cur = plist->_pHead;
	if (cur == pos)
	{
		plist->_pHead = cur->next;
		pos = NULL;
		free(pos);
		return;
	}
	while (cur)
	{
		if (cur->next== pos)
		{
			cur->next = cur->next->next;
			pos = NULL;
			free(pos);
			return;
		}
		cur = cur->next;
		
	}
}


test.c

#include"LinkListFun.h"
void test1()
{
	LinkList p1;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 5);
	Print_LinkList(&p1);
	Pop_Back(&p1);
	Print_LinkList(&p1);
	Pop_Back(&p1);
	Print_LinkList(&p1);
	Pop_Back(&p1);
	Print_LinkList(&p1);
	Pop_Back(&p1);	
	Print_LinkList(&p1);
	Pop_Back(&p1);
	Print_LinkList(&p1);
	Pop_Back(&p1);
	Print_LinkList(&p1);
}
void test2()
{
	LinkList p1;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 5);
	Print_LinkList(&p1);
	Push_Front(&p1,4);
	Print_LinkList(&p1);
	Push_Front(&p1, 6);
	Print_LinkList(&p1);
}
void test3()
{
	LinkList p1;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 5);
	Push_Back(&p1, 6);
	Push_Back(&p1, 7);
	Print_LinkList(&p1);
	Pop_Front(&p1);
	Print_LinkList(&p1);
}
void test4()
{
	LinkList p1;
	pLinkNode ret = NULL;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 5);
	Push_Back(&p1, 6);
	Push_Back(&p1, 7);
	Print_LinkList(&p1);
	ret=Find_NUM(&p1, 5);
	if (ret == NULL)
		printf("-1");
	else
		printf("%d", ret->_data);
}
void test5()
{
	LinkList p1;
	pLinkNode ret = NULL;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 2);
	Push_Back(&p1, 6);
	Push_Back(&p1, 7);
	Print_LinkList(&p1);
	Remove_LinkList(&p1, 7);
	//Remove_all(&p1, 2);
	Print_LinkList(&p1);

}
void test6()
{
	LinkList p1;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 2);
	Push_Back(&p1, 6);
	Push_Back(&p1, 7);
	Print_LinkList(&p1);
	Bubble_Sort(&p1);
	Print_LinkList(&p1);
}
void test7()
{
	LinkList p1;
	Init_LinkList(&p1);
	Push_Back(&p1, 1);
	Push_Back(&p1, 3);
	Push_Back(&p1, 2);
	Push_Back(&p1, 0);
	Push_Back(&p1, 2);
	Push_Back(&p1, 6);
	Push_Back(&p1, 7);
	Print_LinkList(&p1);
	/*Erase_LinkList(&p1, Find_NUM(&p1,1));
	Print_LinkList(&p1);*/
	//Insert_Front(&p1,Find_NUM(&p1,0),4 );
	//Print_LinkList(&p1);

	Insert_Back(&p1,Find_NUM(&p1,1),5);
	Print_LinkList(&p1);

}
int main()
{
	//test1();
	//test2();
	//test3();
	//test5();
	//test6();
	test7();
	getchar();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值