数据结构 链表建立和相关操作函数的编写

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct Node/*我们先创立一个结点的数据类型,其中包括一个整型数据和一个和自己同类的指针                
                     变量*/
{
	int data;
	struct Node * pNext;
}NODE,*PNODE;/*typedef用于给建立的数据类型和其地址进行定名,这里我们就把我们设立的结点数据结 
                 构和其地址分别命名为NODE和PNODE*/

PNODE create_list(void);

void traverse_list(PNODE pHead);//遍历(需传入头指针,也就是头节点地址) 

void insert_(PNODE,int,int);//插入(第一个输入头指针,第二个是要插入的第次,第三个为要撤入的数据) 

void remove_(PNODE,int);//删除(第一个输入头指针,第二个是要删除的第次) 

void sort_(PNODE);//排序 

int empty_(PNODE);//判断是否为空 

int len(PNODE);//返回长度值 





int main(void)
{
	PNODE pHead = NULL;//头指针 
	pHead = create_list();//创建一个非循单环链表,返回头节点的地址给头指针 
	traverse_list(pHead);//遍历 
	insert_(pHead,3,100);//在第三个位置插入一个值为100的数据 
	traverse_list(pHead);//遍历 
	remove_(pHead,3);//删除第三个数据 
	traverse_list(pHead);//遍历 
	sort_(pHead);//排序 
	traverse_list(pHead);//遍历 
	return 0;
}




PNODE create_list(void)//创建链表 
{
	int len;
	int i;
	int val;//用来临时存放用户输入的结点的值 
	printf("请输入您需要生成的链表结点个数:len =");
	scanf("%d",&len);
	PNODE pHead = (PNODE)malloc(sizeof(NODE));//建立头节点 
	PNODE ptail = pHead;
	ptail->pNext= NULL;//ptail->pNext这个的含义为尾指针指向的结点中名为 pNext的地址变量 
	if(NULL==pHead)
	{
		printf("输入失败,程序终止!\n");
		exit(-1);
	}
	for(i=0;i<len;++i)
	{
		printf("请输入第%d个结点的值:",i+1);
		scanf("%d",&val);
		PNODE pNew = (PNODE)malloc(sizeof(NODE));
		if(NULL==pHead)
		{
		printf("输入失败,程序终止!\n");
		exit(-1);
		}
		else
		{
			ptail->pNext = pNew;
			pNew->data = val;
			ptail = pNew;
			ptail->pNext=NULL;//注意最后一个结点一定要指向空 
		}
	}
	return  pHead;//返回该链表的头指针 
}	
void traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext;
	while(p!=NULL)
	{
		printf("%d  ",p->data);
		p = p->pNext;
	}
	printf("\n");
}
int empty_(PNODE pHead)//判断是否为空,空则返回1,不空则返回0 
{
	if(NULL==pHead->pNext)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int len(PNODE pHead)//测定长度(有效结点数,头节点不算有效结点),返回长度值 
{
	int len = 0;
	PNODE p = pHead;
	while(NULL!=p->pNext)
	{
		len++;
		p = p->pNext;
	}
	return len;
}
void insert_(PNODE pHead,int i,int val)
{
	if(i<1||i>len(pHead)+1)
	{
		printf("插入操作不符合要求!\n");
		return;
	}
	PNODE p= pHead;
	int j;
	for(j=1;j<i;j++)
	{
		p=p->pNext;//p此时指向要插入结点次序的前一个结点 
	}
	PNODE k = NULL;//k要指向要插入的结点
	k = (PNODE)malloc(sizeof(NODE));
	k->data = val;
	k->pNext = p->pNext;
	p->pNext = k; 
}
void remove_(PNODE pHead,int i)
{
	PNODE p = pHead;
	int j;
	for(j=1;j<i;j++)
	{
		p = p->pNext;
	}
	PNODE q = p->pNext;
	p->pNext = q->pNext;
	free(q);
}

void sort_(PNODE pHead)
{
	PNODE p = pHead->pNext;
	PNODE q = p->pNext;
	int i,j,t;
	for(i=1;i<len(pHead);i++,p=p->pNext)
	{
		for(j=i+1,q=p->pNext;j<len(pHead)+1;j++,q=q->pNext)
		{
			if(p->data > q->data)
			{
				t=p->data;
				p->data=q->data;
				q->data=t;
			}
			
		}
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值