码迷,mamicode.com
首页 > 其他好文 > 详细

单链表的PushBack,PopBack,Insert...函数

时间:2015-10-20 19:51:38      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:单链表

单链表的熟悉使用,注意测试用例的全面

//使用引用的作用等同于使用二级指针,在传递指针时
//传引用是可能改变Link,而有的函数只需改变->next,此时不需传引用
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<assert.h>
typedef int  DataType;
typedef struct LinkNode
{
	DataType  _data;//节点数据
	struct   LinkNode* _next;//指向下一个节点的指针
}LinkNode, *PLinkNode;
void  InitList(PLinkNode& PLinkhead);//初始化
void  PrintList(PLinkNode PLinkhead);//打印
int  GetLinkNode(PLinkNode PLinkhead);//获取节点数
void DestoryNode(PLinkNode& PLinkhead);//销毁链表
void  PushBack(PLinkNode& PLinkhead, DataType x);//尾插
void  PopBack(PLinkNode& PLinkhead);//尾删
void  PushFront(PLinkNode& PLinkhead, DataType x);//头插
void  PopFront(PLinkNode& PLinkhead);//头删
PLinkNode Find(PLinkNode PLinkhead, DataType x);//查找x的位置
void  Erase(PLinkNode& PLinkhead, PLinkNode pos);//删除pos处的节点
void  EraseNoTaiNode(PLinkNode  pos);//无头指针删除,可采用拷贝下一个结点数据,删除下一个结点
void  Insert(PLinkNode pos, DataType x);//在pos后面插入一个节点
void  Remove(PLinkNode& PLinkhead, DataType x);//删除链表中的第一个x
void  RemoveAll(PLinkNode& PLinkhead, DataType x);//删除链表中所有的x
void  Test();//测试
PLinkNode  BuyNode(DataType x);//开辟PLinkNode空间存储x

PLinkNode  BuyNode(DataType x)
{
	PLinkNode tmp;
	tmp=(PLinkNode)malloc(sizeof(LinkNode));
	tmp->_data = x;
	tmp->_next = NULL;
	return  tmp;
}
void  InitList(PLinkNode& PLinkhead)
{
	PLinkhead = NULL;
}
void  PrintList(PLinkNode PLinkhead)
{
	PLinkNode cur=PLinkhead;
	while (cur != NULL)
	{
		printf("%d->", cur->_data);
		cur = cur->_next;
	}
	printf("NULL\n");
}
int  GetLinkNode(PLinkNode PLinkhead)
{
	int count = 0;
	PLinkNode cur = PLinkhead;
	while (cur != NULL)
	{
		count++;
		cur = cur->_next;
	}
	return count;
}
void DestoryNode(PLinkNode& PLinkhead)
{
	PLinkNode del = PLinkhead;
	while (PLinkhead!= NULL)
	{
		del = PLinkhead;
        PLinkhead = PLinkhead->_next;
	    free(del);
	}
}
void  PushBack(PLinkNode& PLinkhead, DataType x)
{
	if (PLinkhead == NULL)
	{
		PLinkhead = BuyNode(x);
	}
	else
	{
		PLinkNode end =PLinkhead;
		while (end->_next != NULL)
		{
			end = end->_next;
		}
		end->_next = BuyNode(x);
	} 
}
void  PopBack(PLinkNode& PLinkhead)
{
	if (PLinkhead == NULL)
	{
		return;
	}
	else if (PLinkhead->_next == NULL)
	{
		free(PLinkhead);
		PLinkhead = NULL;
	}
	else
	{
		PLinkNode end=PLinkhead,pre=NULL;
		while (end->_next != NULL)
		{
			pre = end;
			end = end->_next;
		}
		pre->_next = NULL;
		free(end);
	}
}
void  PushFront(PLinkNode& PLinkhead, DataType x)
{
	if (PLinkhead == NULL)
	{
		PLinkhead = BuyNode(x);
	}
	else
	{
		PLinkNode start = BuyNode(x);
		start->_next = PLinkhead;
		PLinkhead = start;
	}
}
void  PopFront(PLinkNode& PLinkhead)
{
	if (PLinkhead == NULL)
	{
		return;
	}
	else if (PLinkhead->_next == NULL)
	{
		free(PLinkhead);
		PLinkhead = NULL;
	}
	else
	{
		PLinkNode end = PLinkhead;
		PLinkhead = PLinkhead->_next;
		free(end);
	}
}
PLinkNode Find(PLinkNode PLinkhead, DataType x)
{
	PLinkNode  cur = PLinkhead;
	while (cur)
	{
		if (cur->_data == x)
			return cur;
		else
			cur = cur->_next;
	}
	return NULL;
}
void  Erase(PLinkNode& PLinkhead, PLinkNode pos)
{
	assert(pos);
	PLinkNode  pre = PLinkhead;
	assert(pos);
	if (pos == PLinkhead)
	{
		PLinkhead = pos->_next;
		free(pos);
	}
	else
	{
		while (pre&&pre->_next != pos)
		{
			pre = pre->_next;
		}
		if (pre)
		{
			pre->_next = pos->_next;
			free(pos);
		}
		else
			printf("为找到此位置\n");
	}

}
void  EraseNoTaiNode(PLinkNode pos)//删除一个非尾节点的无头节点
{
	PLinkNode del = pos->_next;//保存pos的下一节点
	pos->_data = pos->_next->_data;
	pos->_next = del->_next;
	free(del);
}
void  Insert(PLinkNode pos, DataType x)//在pos后面插入x
{
	PLinkNode cur = BuyNode(x);
	if (pos == NULL)
	{
		printf("插入位置错误\n");
		return;
	}
	cur->_next = pos->_next;
	pos->_next = cur;
}
void  Remove(PLinkNode& PLinkhead, DataType x)
{
	PLinkNode  cur = PLinkhead,pre=NULL;
	if (PLinkhead->_data == x)
	{
		PLinkhead=PLinkhead->_next;
		free(cur);
	}
	else
	{
		while (cur&&cur->_data != x)
		{
			pre = cur;
			cur = cur->_next;
		}
		if (cur)
		{
			pre->_next= cur->_next;
			free(cur->_next);
		}
	}
}
void  RemoveAll(PLinkNode& PLinkhead, DataType x)
{
	PLinkNode cur = PLinkhead, pre = NULL;
	if (cur->_data == x)
	{
		PLinkhead = PLinkhead->_next;
		free(cur);
	}
	cur = PLinkhead;
	while (1)
	{
		while (cur&&cur->_data != x)
		{
			pre = cur;
			cur = cur->_next;
		}
		if (cur)
		{
			pre->_next = cur->_next;
			free(cur);
			cur = pre->_next;
		}
	    else
		    return;
	 }
	
}

void  Test()
{
	PLinkNode Link;
	InitList(Link);
	PushBack(Link,3);
	PushBack(Link, 2);
	PushBack(Link, 3);
	PushBack(Link, 4);
	PrintList(Link);


	PushFront(Link, 5);
	PushFront(Link, 6);
	PushFront(Link, 7);
	PrintList(Link);

	

	EraseNoTaiNode(Find(Link, 2));
	PrintList(Link);

	Insert(Find(Link, 2), 5);
	PrintList(Link);
	Insert(Find(Link, 3), 5);
	PrintList(Link);


	Remove(Link, 1);
	Remove(Link, 4);
	PrintList(Link);


	RemoveAll(Link, 3);
	PrintList(Link);
	
	DestoryNode(Link);
	PrintList(Link);

}

int main()
{
	Test();
	system("pause");
	return 0;
}

本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1704468

单链表的PushBack,PopBack,Insert...函数

标签:单链表

原文地址:http://10541556.blog.51cto.com/10531556/1704468

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!