【数据结构】单链表的简单实现

头文件

#ifndef __LINKLIST_H__ 
#define __LINKLIST_H__ 

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

typedef int DataType;


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




void InitLinkList(pList* pplist);
void DestroyLinkList(pList* pplist);
int GetListLength(pList plist);
void PushFront(pList* pplist, DataType d);
void PushBack(pList* pplist, DataType d);
pNode BuyNode(DataType d);
void PrintLinkList(pList plist);
void PopFront(pList* pplist);
void PopBack(pList* pplist);
pNode Find(pList plist, DataType d);


#endif 

函数文件

#include"LinkList.h"

void InitLinkList(pList * pplist)
{
	assert(pplist != NULL);
	*pplist = NULL;
}
void PrintLinkList(pList plist)
{
	pNode cur = plist;
	if (NULL == plist)
	{
		printf(" ");
		return;
	}
	while (cur != NULL)
	{
		printf("%d-->", cur->data);
		cur = cur->next;
	}
	printf("Over\n");
}
void PushFront(pList * pplist, DataType d)
{
	pNode newNode = NULL;
	assert(pplist != NULL);
	newNode = BuyNode(d);
	newNode->next = *pplist;
	*pplist = newNode;
}
void PushBack(pList * pplist, DataType d)
{
	pNode newNode = BuyNode(d);//利用BuyNode创建新节点
	assert(pplist != NULL);
	if (*pplist == NULL)//空链表
	{
		*pplist = newNode;//将头指针和新节点挂链起来
	}
	else//非空链表
	{
		pNode cur = *pplist;
		while (cur->next != NULL)
		{
			cur = cur->next;
		}
		cur->next = newNode;
	}
}
int GetListLength(pList plist)
{
	pNode cur = plist;
	int count = 0;
	while (cur)
	{
		count++;
		cur = cur->next;
	}
	return count;
}

pNode BuyNode(DataType d)
{
	pNode newNode = (pNode)malloc(sizeof(Node));//开辟新节点
	if (NULL == newNode)
	{
		exit(EXIT_FAILURE);
	}
	newNode->data = d;
	newNode->next = NULL;
	return newNode;
}

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



void PopBack(pList * pplist)
{
	assert(pplist != NULL);
	if (*pplist == NULL)//没有节点
	{
		return;
	}
	if ((*pplist)->next == NULL)//一个节点
	{
		free(*pplist);
		*pplist = NULL;
		return;
	}
	else//一个以上的节点
	{
		pNode cur = *pplist;
		while (cur->next->next != NULL)
		{
			cur = cur->next;
		}
		free(cur->next);
		cur->next = NULL;
	}

}



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 = plist;
	while (cur)
	{
		if (cur->data == d)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;//没找到
}

测试文件

#define _CRT_SECURE_NO_WARNINGS 1

#include"LinkList.h"
void test()
{
	Node* plist = NULL;//指向第一个节点的指针
	InitLinkList(&plist);//初始化plist为空指针,所以要传地址
	PushBack(&plist, 1);//传地址的原因:当链表中没有节点时,要改变plist,所以要传地址
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PrintLinkList(plist);
	/*DestroyLinkList(&plist);
	PrintLinkList(plist);*/
	printf("%d个节点\n", GetListLength(plist));
}
void TestPopBack()
{
	Node* plist = NULL;//指向第一个节点的指针
	InitLinkList(&plist);//初始化plist为空指针,所以要传地址
	PushBack(&plist, 1);//传地址的原因:当链表中没有节点时,要改变plist,所以要传地址
	PushBack(&plist, 2);
	PushBack(&plist, 3);
	PushBack(&plist, 4);
	PrintLinkList(plist);
	PopBack(&plist);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}
void TestPushFront()
{
	Node* plist = NULL;//指向第一个节点的指针
	PushFront(&plist, 1);
	PushFront(&plist, 2);
	PushFront(&plist, 3);
	PushFront(&plist, 4);
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}
void TestPopFront()
{
	Node* plist = NULL;//指向第一个节点的指针
	PushFront(&plist, 1);
	PushFront(&plist, 2);
	PushFront(&plist, 3);
	PushFront(&plist, 4);

	PrintLinkList(plist);

	PopFront(&plist);

	PrintLinkList(plist);
	DestroyLinkList(&plist);
}
void TestFind()
{
	Node* plist = NULL;//指向第一个节点的指针
	pNode pos = NULL;
	PushFront(&plist, 1);
	PushFront(&plist, 2);
	PushFront(&plist, 3);
	PushFront(&plist, 8);
	PrintLinkList(plist);
	pos = Find(plist, 1);
	if (pos != NULL)
	{
		printf("%d\n", pos->data);
	}
	PrintLinkList(plist);
	DestroyLinkList(&plist);
}


int main()
{
	/*test();*/
	//TestPopBack();
	//TestPushFront();
	/*TestPopFront();*/
	/*TestFind();*/

	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_41892460/article/details/82855823
今日推荐