链表(c语言)

2 篇文章 0 订阅

对于链表我都快忘记了,于是花了点时间重温一下。
对于基础的介绍我就不多说了,链表最基本的功能,增删改,排序,展示。

typedef struct node
{
	int dataType;
	struct node * pNext;
}NODE,*PNODE;

最基本的结构体,数据和next指针,当然数据可以是各种类型甚至也可以是一个结构体。首先得建表,是需要一个lenth的,当然可以写代码,我嫌麻烦直接弄一个全局变量lenth。

//int lenth(PNODE pHead)
//{
//	PNODE p = pHead->pNext;
//	int lenth = 0;
//	for(lenth = 0;p != NULL;lenth++)
//	{
//		p = p->pNext;
//	}
//	return lenth;
//}

建表:

PNODE createList()
{
	int val;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(pHead != NULL)
	{
		PNODE pH = pHead;
		pHead->pNext = NULL;

		printf("lenth of node: ");
		scanf_s("%d",&lenth);
		for(int i = 0; i < lenth; i ++)
		{
			PNODE p = (PNODE)malloc(sizeof(NODE));
			if(p != NULL)
			{
				printf("input value: ");
				scanf_s("%d",&val);
				p->dataType = val;
				pH->pNext = p;
				p->pNext = NULL;
				pH = p;
			}
		}
	}
	return pHead;
}

代码比较简单。主要是增加和删除,主要思路:如图在这里插入图片描述

void deleteNode(PNODE pHead,int pos)
{
	int i;
	PNODE p = pHead;
	if( p !=NULL && pos <= lenth)
	{
		for(i = 0;i < pos - 1; i ++)
		{
			p = p->pNext;
		}
		PNODE q = p->pNext;
		p->pNext = q->pNext;
		free(q);
		q = NULL;
		lenth --;
	}
	else
	{
		printf("删除位置有误,链表不变\n");
	}

}

void insert(PNODE pHead,int pos,int val)
{
	int i;
	PNODE p = pHead;
	if( p !=NULL && pos <= lenth)
	{
		for(i = 0;i < pos - 1; i ++)
		{
			p = p->pNext;
		}
		PNODE q = (PNODE)malloc(sizeof(NODE));
		q->dataType = val;
		q->pNext = p->pNext;
		p->pNext = q;

		lenth ++;
	}
	else
	{
		printf("插入位置有误,链表不变\n");
	}

}

其他的就手到擒来了。display很简单,排序基于display遍历的思想,第二层循环每次只于后面的进行比较。

void display(PNODE pHead)
{
	PNODE p1;
	int i;
//	int len = lenth(pHead);
	for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
	{
		printf("%d -->",p1->dataType);
	}
	printf("NULL\n");
}
void sort(PNODE pHead)	//排序
{
	PNODE p1,p2;
	int i,j;
	int m;
	//	int len = lenth(pHead);
	for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
	{
		for(j = i+1,p2 = p1->pNext; j < lenth; j ++, p2 = p2->pNext)
		{
			if(p1->dataType > p2->dataType)
			{
				m = p1->dataType;
				p1->dataType = p2->dataType;
				p2->dataType = m;
			}
		}	
	}
}

void modify(PNODE pHead,int pos,int val)	//修改
{
	int i;
	PNODE p = pHead;
	if( p !=NULL && pos <= lenth)
	{
		for(i = 0;i < pos - 1; i ++)
		{
			p = p->pNext;
		}

		p->pNext->dataType = val;
	}

}

最后附上完整测试代码

#include <stdlib.h>

int lenth = 0;
typedef struct node
{
	int dataType;
	struct node * pNext;
}NODE,*PNODE;


PNODE createList()
{
	int val;
	PNODE pHead = (PNODE)malloc(sizeof(NODE));
	if(pHead != NULL)
	{
		PNODE pH = pHead;
		pHead->pNext = NULL;

		printf("lenth of node: ");
		scanf_s("%d",&lenth);
		for(int i = 0; i < lenth; i ++)
		{
			PNODE p = (PNODE)malloc(sizeof(NODE));
			if(p != NULL)
			{
				printf("input value: ");
				scanf_s("%d",&val);
				p->dataType = val;
				pH->pNext = p;
				p->pNext = NULL;
				pH = p;
			}
		}
	}
	return pHead;
}

//int lenth(PNODE pHead)
//{
//	PNODE p = pHead->pNext;
//	int lenth = 0;
//	for(lenth = 0;p != NULL;lenth++)
//	{
//		p = p->pNext;
//	}
//	return lenth;
//}

void display(PNODE pHead)
{
	PNODE p1;
	int i;
//	int len = lenth(pHead);
	for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
	{
		printf("%d -->",p1->dataType);
	}
	printf("NULL\n");
}

void deleteNode(PNODE pHead,int pos)
{
	int i;
	PNODE p = pHead;
	if( p !=NULL && pos <= lenth)
	{
		for(i = 0;i < pos - 1; i ++)
		{
			p = p->pNext;
		}
		PNODE q = p->pNext;
		p->pNext = q->pNext;
		free(q);
		q = NULL;
		lenth --;
	}
	else
	{
		printf("删除位置有误,链表不变\n");
	}

}

void insert(PNODE pHead,int pos,int val)
{
	int i;
	PNODE p = pHead;
	if( p !=NULL && pos <= lenth)
	{
		for(i = 0;i < pos - 1; i ++)
		{
			p = p->pNext;
		}
		PNODE q = (PNODE)malloc(sizeof(NODE));
		q->dataType = val;
		q->pNext = p->pNext;
		p->pNext = q;

		lenth ++;
	}
	else
	{
		printf("插入位置有误,链表不变\n");
	}

}

void sort(PNODE pHead)
{
	PNODE p1,p2;
	int i,j;
	int m;
	//	int len = lenth(pHead);
	for(i = 0,p1 = pHead->pNext; i < lenth; i ++, p1 = p1->pNext)
	{
		for(j = i+1,p2 = p1->pNext; j < lenth; j ++, p2 = p2->pNext)
		{
			if(p1->dataType > p2->dataType)
			{
				m = p1->dataType;
				p1->dataType = p2->dataType;
				p2->dataType = m;
			}
		}	
	}
}

void modify(PNODE pHead,int pos,int val)
{
	int i;
	PNODE p = pHead;
	if( p !=NULL && pos <= lenth)
	{
		for(i = 0;i < pos - 1; i ++)
		{
			p = p->pNext;
		}

		p->pNext->dataType = val;
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	PNODE pHead1 = createList();
	display(pHead1);
	deleteNode(pHead1,2);
	display(pHead1);

	insert(pHead1,2,10);
	display(pHead1);

	sort(pHead1);
	display(pHead1);

	modify(pHead1,1,6);
	display(pHead1);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值