链表的查找、排序、增删、检查

// 基础版 链表的建立、遍历、增、删、排序、判断是否为空、求长度
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//定义一个结构体类型及其别名 
typedef struct Node
{
	int data;
	struct Node* pNext;  //定义一个能指向结构体类型变量的指针 
}NODE,* PNODE;  //这里 NODE相当于  struct Node  ,PNODE 相当于 struct Node *; 

//函数声明 ,最后需要加分号 
PNODE create_list(void); //定义了一个创建链表的函数
void traverse_list (PNODE pHead); //定义了一个能遍历链表的函数
bool is_empty (PNODE pHead);  //定义了一个检查链表是否为空的函数
int length_list (PNODE pHead); //定义了一个求链表长度的函数 
bool insert_list (PNODE , int ,int ); //定义了一个能插入结点的函数,这里需要给出链表的指针、插入结点的链表的位置、插入的节点的值;
bool delete_list (PNODE pHead, int post, int *val); //定义了一个能删除结点的函数
void sort_list (PNODE pHead);  //定义了一个能为链表排序的函数 


int main() //定义主函数 
{
	int pos1,val1,pos2;
	int val2;
	PNODE pHead=NULL; //相当于 struct Node pHead=NULL
	pHead=create_list(); //创建链表 
	traverse_list(pHead); //遍历链表 
	printf("请输入您要增添链表的位置和值:",pos1,val1);
	scanf("%d%d",&pos1,&val1);
	insert_list (pHead,pos1,val1);
	printf("您增添后的链表为:\n");
	traverse_list(pHead); //遍历链表 
	printf("请输入您要删除链表的位置和该位置的值:");
	scanf("%d%d",&pos2,&val2);
	if( delete_list (pHead,pos2,&val2))
	{ 
		printf("删除成功,您删除的元素是:%d\n",val2);
		printf("您删除后的链表为:\n");
		traverse_list(pHead);
	}
	else
	{
		printf("未删除成功,请重试\n");
	}
	
	
return 0;
 } 
 
 PNODE create_list(void)  //创建链表 
 {
 	int len;//记录链表的长度
	int i;
	int val;//记录于存放链表中的数据
	PNODE pHead=(PNODE)malloc(sizeof(NODE));//为头指针分配空间
	if(pHead==NULL) //检查是否分配内存	
	{
		printf("分配失败,程序终止\n");
		exit(-1);
	 } 
    PNODE Tail=pHead; //创建一个尾指针;    	
	Tail->pNext=NULL;
	printf("请输入您需要生成链表的结点的个数:len=");
	scanf("%d",&len);
	for(i=0;i<len;i++)
	{
		printf("请输入第%d个结点的值:",i+1);
		scanf("%d",&val);
		PNODE pNew=(PNODE)malloc(sizeof(NODE));
		if (pNew==NULL)
		{
			printf("分配内存失败,程序终止");
			exit(-1);
		}
		pNew->data=val;
		Tail->pNext=pNew;
		pNew->pNext =NULL;
		Tail=pNew; 
	}
return pHead;	  
} 
 
void traverse_list(PNODE pHead) //遍历链表 
{
	PNODE p=pHead->pNext;
	while(p!=NULL)
	{
		printf("%d\t",p->data );
		p=p->pNext ;
	 } 
	printf("\n");
	return;
}


bool is_empty(PNODE pHead)  //检查链表是否为空 
{
	if (NULL==pHead->pNext)
	   return true;
	else
	  return false;
}
  
length_list (PNODE pHead)  //记录链表的长度 
{
  	PNODE p=pHead->pNext;
  	int len=0;
  	while(p!=NULL)
  	{
  		len++;
  		p=p->pNext ;
	}
	return len;
}

void sort_list (PNODE pHead) //对链表进行排序 
{
  	int i,j,t;
	int len=length_list (pHead);
	PNODE p,q;
	for(i=0,p=pHead->pNext ;i<len-1;i++,p=p->pNext )
	{
		for(j=0,q=p->pNext ;j<len;j++,q=p->pNext )
	   {
	   	if (q->data  <p->data )
	   	{
	   	 t=p->data ;
		 p->data =q->data ;
		 q->data =p->data ;	
		}
		} 
	}	
} 

bool insert_list (PNODE pHead ,int pos,int val)  //查找并添加链表,需要链表的地址,添加节点的节点值,链表里数据的值 
{
   int i=0;
   PNODE p=pHead;
   while (p!=NULL && i<pos-1)
   {
     p=p->pNext ;
	 i++;	
   }	
   if(i>pos-1||p==NULL)
   {
   	return false;
   }
   PNODE pNew=(PNODE)malloc(sizeof(NODE));
   if (pNew==NULL)
   {
   	printf("动态分配内存失败!");
   	exit (-1);
   }
   pNew->data =val;
   PNODE q=p->pNext;  
   p->pNext=pNew;
    pNew->pNext=q;

   return true;
}

bool delete_list (PNODE pHead,int pos,int *pval) 
{
	int i=0;
	PNODE p=pHead;
	while(p->pNext!=NULL &&i<pos-1)
	{
		p=p->pNext ;
		i++;
	}
	if (i>pos-1 ||p->pNext==NULL)
	 return false;
	PNODE q=p->pNext ;
	*pval=q->data ;
	p->pNext =p->pNext ->pNext;
	free(q);
	q=NULL;
	return true;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值