链表的插入、删除、判断是否为空、排序、求链表的长度(数据结构)

接着上次链表的创建和遍历,这次写了链表的插入、删除、判断是否为空、排序、求链表的长度。数据结构的小算法,自己实现的。可以做为参考。

理论知识:

有时间补上。

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

typedef struct Node
{
	int date;		   //数据域
	struct Node *pNext;//指针域
}NODE,*PNODE;

//函数申明
PNODE Create_list(void);
void traverse_list(PNODE pHead);//遍历链表
bool is_empty(PNODE pHead);//判断链表是否为空
int length_list(PNODE pHead);//求链表的长度
bool insert_list(PNODE pHead,int site,int val);//插入节点
int delete_list(PNODE pHead,int site);//删除节点
void sort_list(PNODE);//排序

int main()
{
	PNODE pHead = NULL;
	pHead = Create_list();
	is_empty(pHead);
	traverse_list(pHead); //遍历链表
	printf("链表的长度为 = %d\n",length_list(pHead));
	printf("排序\n");
	sort_list(pHead);
	traverse_list(pHead); //遍历链表
	printf("插入\n");
	insert_list(pHead,3,10);
	traverse_list(pHead); //遍历链表
	printf("删除\n");
	delete_list(pHead,2);//删除节点
	traverse_list(pHead); //遍历链表
	return 0;
}
void sort_list(PNODE pHead)
{
	PNODE p,q;
	int i,j,t;
	int len = length_list(pHead);

	for(i = 0,p = pHead -> pNext;i < len - 1; ++i,p = p -> pNext)
	{	
		for( j = i + 1,q = p -> pNext;j < len;++j,q = q -> pNext)
		{
			if(p -> date > q -> date)	
			{
				t = p -> date;
				p -> date = q -> date;
				q -> date = t;
			}			
		}
	}
	return;
}
int delete_list(PNODE pHead,int site)//删除节点
{
	int val = 0;
	if(site < 0 || site > length_list(pHead))
	{
		printf("序号出错!\n");
		exit(-1);
	}
	else 
	{
		PNODE p,q;
		p = pHead;
		for(int i = 0; i < site - 1; ++i)
		{
			p = p -> pNext;
		}
		q = p -> pNext;
		p -> pNext = q -> pNext;
		printf("删除的数据为:%d\n",val = q -> date);
		free(q);
	}
	return val;
}
bool insert_list(PNODE pHead,int site,int val)//插入节点
{
	if(site < 0 || site > length_list(pHead))
	{
		printf("输入序号有误!\n");
		exit(-1);
	}
	else
	{
		PNODE p = pHead;
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		
		for(int i = 0; i < site; ++i)
		{
			p = p -> pNext;
		}
		
		pNew -> date = val;
		pNew -> pNext = p -> pNext;
		p -> pNext = pNew;
	}
	return true;
}
int length_list(PNODE pHead)//求链表的长度
{
	int i = 0;
	while(NULL != pHead -> pNext)
	{
		++i;
		pHead = pHead -> pNext;
	}
	return i;
}
bool is_empty(PNODE pHead)//判断链表是否为空
{
	if(NULL == pHead -> pNext)
	{
		printf("链表为空!\n");
		return true;
	}
	else
	{
		printf("链表不为空!\n");
		return false;
	}
}

PNODE Create_list(void)
{
	int len = 0;
	printf("请输入你需要创建的节点数:");
	scanf("%d",&len);
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(pHead == NULL)
	{
		printf("分配失败!\n");
		exit(-1);
	}
	PNODE pTail = pHead;
	if(0 == len)
	{
		pHead -> pNext = NULL;
	}
	printf("开始分配数据\n");
	for(int i = 0; i < len; ++i)
	{		
		int val = 0;
		scanf("%d",&val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL == pNew)
		{
			printf("分配失败!\n");
			exit(-1);
		}
		pNew -> date = val;
		pTail -> pNext = pNew;
		pNew -> pNext = NULL;
		pTail = pNew;
	}
	return pHead;
}
void traverse_list(PNODE pHead)
{
	PNODE p = pHead -> pNext;
	while(NULL != p)
	{
		printf("%d\t",p -> date);
		p = p -> pNext;
	}
	printf("\n");
	return;
}

猜你喜欢

转载自blog.csdn.net/m0_38036750/article/details/88586221