数据结构 C_链表基本接口的实现

头文件

LinkList.h

#ifndef __LINKLIST_H__ 
#define __LINKLIST_H__ 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int DataType;

typedef struct Node
{
	DataType data;
	struct Node* next;
}Node, List, *pNode, *pList;

//初始化
void InitLinkList(pList* pplist);
//申请
pNode BuyNode(DataType d);
//销毁
void DestroyLinkList(pList* pplist);
//尾部插入
void PushBack(pList* pplist, DataType d);
//尾部删除
void PopBack(pList* pplist);
//头部插入
void PushFront(pList* pplist, DataType d);
//头部删除
void PopFront(pList* pplist);
//查找元素
pNode Find(pList plist, DataType d);
//在指定位置之前插入一个值 
void Insert(pList* pplist, pNode pos, DataType d);
//指定位置删除 
void Erase(pList* pplist, pNode pos);
//删除指定元素
void Remove(pList* pplist, DataType d);
//删除所有指定元素
void RemoveAll(pList* pplist, DataType d);
//删除无头单链表的非尾节点(不能遍历链表)
void EraseNotTailNode(pNode pos);
//打印
void PrintLinkList(pList plist);
//链表长度
int GetListLength(pList plist);


#endif //__LINKLIST_H__ 

源文件

LinkList.c



#include "LinkList.h"

//初始化
void InitLinkList(pList* pplist)
{
	assert(pplist != NULL);
	*pplist = NULL;
}

//申请
pNode BuyNode(DataType d)
{
	pNode tmp = (pNode)malloc(sizeof(Node));
	if (tmp == NULL)
	{
		perror("BuyNode::malloc");
		return NULL;
	}
	tmp->data = d;
	tmp->next = NULL;
	return tmp;
}

//尾插法
void PushBack(pList* pplist, DataType d)
{
	pNode newNode = BuyNode(d);
	assert(pplist != NULL);
	if (newNode == NULL)
	{
		exit(EXIT_FAILURE);
	}
	if (*pplist == NULL)//空链表
	{
		*pplist = newNode;
	}
	else
	{
		pNode cur = *pplist;
		while ((cur->next) != NULL)
		{
			cur = cur->next;
		}
		cur->next = newNode;
	}
}

//打印
void PrintLinkList(pList plist)
{
	pNode cur = plist;
	while (cur)
	{
		printf("%d--->", cur->data);
		cur = cur->next;
	}
	printf("over\n");
}

//销毁
void DestroyLinkList(pList* pplist)
{
	assert(pplist != NULL);
	pNode cur = *pplist;
	while (cur != NULL)
	{
		pNode del = cur;
		cur = cur->next;
		free(del);
		del = NULL;
	}
	*pplist = NULL;
}

//尾部删除
void PopBack(pList* pplist)
{
	assert(pplist != NULL);
	pNode cur = *pplist;
	if (*pplist == NULL)
		return;
	if ((*pplist)->next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		while (cur->next->next != NULL)
		{
			cur = cur->next;
		}
		free(cur->next);
		cur->next = NULL;
	}
}

//头部插入
void PushFront(pList* pplist, DataType d)
{
	assert(pplist != NULL);
	pNode newNode = NULL;
	newNode = BuyNode(d);
	newNode->next = *pplist;
	*pplist = newNode;
}

//头部删除
void PopFront(pList* pplist)
{
	assert(pplist != NULL);
	if (*pplist == NULL)
	{
		return;
	}
	else
	{
		pNode del = *pplist;
		*pplist = del->next;
		free(del);
		del = NULL;
	}
}

//查找元素
pNode Find(pList plist, DataType d)
{
	pNode cur = NULL;
	assert(plist != NULL);
	cur = plist;
	if (plist == NULL)
	{
		return NULL;
	}
	else
	{
		if (cur->data == d)
		{
			return cur;
			cur = cur->next;
		}
	}
	return NULL;
}


//在指定位置之前插入一个值 
void Insert(pList* pplist, pNode pos, DataType d)
{
	assert(*pplist != NULL);
	assert(pplist != NULL);
	assert(pos != NULL);
	pNode newNode = NULL;
	if (*pplist == pos)
	{
		newNode = BuyNode(d);
		newNode->next = *pplist;
		*pplist = newNode;
	}
	else
	{
		pNode cur = *pplist;
		while (cur&&cur->next != pos)
		{
			cur = cur->next;
		}
		if (cur != NULL)
		{
			newNode = BuyNode(d);
			newNode->next = pos;
			cur->next = newNode;
		}
	}
}

//指定位置删除
void Erase(pList* pplist, pNode pos)
{
	assert(pplist != NULL);
	assert(pos != NULL);
	pNode tmp = pos;
	if (*pplist == NULL)
		return;
	if (*pplist == pos)
	{
		*pplist = tmp->next;
		free(tmp);
		tmp = NULL;
	}
	else
	{
		pNode cur = *pplist;
		while (cur&&cur->next != NULL)
		{
			cur = cur->next;
		}
		if (cur != NULL)
		{
			cur->next = pos->next;
			free(pos);
			pos = NULL;
		}
	}
}

//删除指定元素
void Remove(pList* pplist, DataType d)

{
	pNode cur = NULL;
	pNode del = NULL;
	assert(pplist != NULL);
	if (*pplist == NULL)
		return;
	cur = *pplist;
	if (cur->data == d)
	{
		del = *pplist;
		*pplist = cur->next;
		free(del);
		del = NULL;
	}
	else
	{
		while (cur&&cur->next->data != d)
		{
			cur = cur->next;
		}
		while (cur)
		{
			del = cur->next;
			cur->next = del->next;
			free(del);
			del = NULL;
			return;
		}
	}
}


//删除所有指定元素
void RemoveAll(pList* pplist, DataType d)
{
	pNode cur = NULL;
	pNode del = NULL;
	assert(pplist != NULL);
	if (*pplist == NULL)
	{
		return;
	}
	cur = *pplist;
	if (cur->data == d)
	{
		return;
	}
	else
	{
		while (cur&&cur->next->data != d)
		{
			cur = cur->next;
		}
		while (cur)
		{
			del = cur->next;
			cur->next = del->next;
			free(del);
			del = NULL;
		}
	}
}

//删除无头单链表的非尾节点(不能遍历链表)
void EraseNotTailNode(pNode pos)
{
	pNode del = NULL;
	assert(pos != NULL);
	if (pos->next == NULL)
	{
		return;
	}
	del = pos->next;
	pos->data = del->data;
	pos->next = del->next;
	DestroyLinkList(&del);
}

//链表长度
int GetListLength(pList plist)
{
	int count = 0;
	if (plist == NULL)
	{
		return 0;
	}
	else
	{
		while (plist)
		{
			count++;
			plist = plist->next;
		}
		return count;
	}
}

test.c



#include"LinkList.h"


void test()//尾部插入
{
	pList plist = NULL;
	InitLinkList(&plist);
	PushBack(&plist, 1);
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}


void test1()//尾部删除
{
	pList plist = NULL;
	InitLinkList(&plist);
	PushBack(&plist, 1);
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PrintLinkList(plist);
	PopBack(&plist);
	PopBack(&plist);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}

void test2()//头部插入,头部删除
{
	pList plist = NULL;
	InitLinkList(&plist);
	PushFront(&plist, 1);
	PushFront(&plist, 3);
	PushFront(&plist, 2);
	PushFront(&plist, 4);
	PrintLinkList(plist);
	PopFront(&plist);
	PopFront(&plist);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}

void test3()//查找元素
{
	pList plist = NULL;
	InitLinkList(&plist);
	PushFront(&plist, 4);
	PushFront(&plist, 3);
	PushFront(&plist, 2);
	PushFront(&plist, 4);
	PrintLinkList(plist);
	pNode ret = Find(plist, 4);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%d\n", ret->data);
	}
	DestroyLinkList(&plist);
}

/*void test4()//删除指定元素
{
	pList plist = NULL;
	InitLinkList(&plist);
	PushFront(&plist, 4);
	PushFront(&plist, 3);
	PushFront(&plist, 2);
	PushFront(&plist, 1);
	PrintLinkList(plist);
	Remove(&plist, 3);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}
*/
void test4()//在指定位置之前插入一个值 
{
	pNode pos = NULL;
	pList plist = NULL;
	InitLinkList(&plist);
	PushFront(&plist, 4);
	PushFront(&plist, 3);
	PushFront(&plist, 2);
	PushFront(&plist, 1);
	PrintLinkList(plist);
	pos = Find(plist, 1);
	if (pos != NULL)
	{
		Insert(&plist, pos, 5);
	}
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}

void test5()//指定位置删除
{
	pNode pos = NULL;
	pList plist;
	InitLinkList(&plist);
	PushBack(&plist, 1);
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PrintLinkList(plist);
	pos = Find(plist, 1);
	if (pos != NULL)
	{
		Erase(&plist, pos);
	}
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}


void test6()//删除指定元素
{
	pList List;
	InitLinkList(&List);
	PushFront(&List, 4);
	PushFront(&List, 3);
	PushFront(&List, 2);
	PushFront(&List, 1);
	PrintLinkList(List);
	Remove(&List, 3);
	PrintLinkList(List);
	DestroyLinkList(&List);
}

void test7()//删除所有指定元素
{
	pList plist;
	InitLinkList(&plist);
	PushBack(&plist, 2);
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PushBack(&plist, 2);
	PrintLinkList(plist);
	RemoveAll(&plist, 2);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}


void test8()
{
	pList plist;
	pNode newNode = NULL;
	InitLinkList(&plist);
	PushBack(&plist, 1);
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PushBack(&plist, 5);
	newNode = Find(plist, 3);
	EraseNotTailNode(newNode);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}

//链表长度
void test9()
{
	int length = 0;
	pList plist;
	InitLinkList(&plist);
	PushBack(&plist, 1);
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PushBack(&plist, 5);
	PrintLinkList(plist);
	length = GetListLength(plist);
	printf("单链表长度为:%d\n", length);
	Remove(&plist, 2);
	PrintLinkList(plist);
	length = GetListLength(plist);
	printf("单链表长度为:%d\n", length);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}



int main()
{
	//test();
	//test1();
	//test2();
	//test3();
	//test4();
	//test5();
	//test6();
	//test7();
	//test8();
	//test9();


	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Soldier49Zed/article/details/81220370
今日推荐