数据结构--链表2

今天继续介绍数据结构中的链表这块这块内容,前面介绍了创建数据链表采用头插法,尾插法,今天主要介绍的是有序插法。

在介绍有序插法前先进行头插法与尾部插法的总结。

新建链表主要有三种方法:头插法,尾插法,有序插法

头插法的主要思路:

链表为空的时候,新节点变为头结点、尾部节点。

链表不为空的时候,新节点的pnext指向原有的头节点,新的节点就会变成头结点。

尾插法的主要思路:

链表为空的时候,新节点变为头节点,尾节点。

链表不为空的时候,原有的节点的pnext指向德新的节点,新的节点就会变成了尾节点。

有序插法的主要思路:

  • 为新节点开辟新的空间(malloc /calloc)
  • pstu ppre,pcur //定义两个中间百年量,用于节点的中间插入
  • ppre pcur 指向头节点
  • 链表为空的时候,新节点变为头节点尾节点
  • 链表不为空的时候,判断新节点的值是否小于头结点所所指向的值,如果小于头节点的值小于当前插入的值,就进行中间插入
  • 通过pcur进行遍历链表,发现某个节点的值大于新节点的值,该节点的pnext就会指向新的节点。新的节点的pnext指向当前的节点。
  • pcur指向空对地时候说明需要进行尾部插入,ppre的pnext指向pnew,而
#include  <stdio.h>
#include <stdlib.h>

//定义一个结构作为节点
typedef struct  student
{
  int num;
  struct student *pnext;

}pstu;
/*
 函数功能:实现一个z中间插入的有序插法(从小到大排序)
 主要步骤:1.首先为新节点申请内存
           2.定义两个中间指针变量 pstu *ppre *pcur
		   3.ppre,pcur指向头结点
		   4.链表为空时,新节点变为头节点,为节点
		   5.链表不为空时,判断新节点的值是是不是小于头头节点的值,如果是小于,就使用头插法。
             如果不小于头结点的值,就插入到中间,通过pcur进行遍历链表,发现某个节点的值大于
			 新节点的值,该节点前的pnext指向新节点,新节点的pnext指向当前节点。ppre=pcur,
			 pcur=pcur->next
			 
*/
void list_sort_insert(pstu **phead,pstu **ptail,int i)
{
 pstu *pnew,*pcur,*ppre;//pnew为带入在ppre与pcur之间的值
 pcur=*phead;//解引用
 ppre=*ptail;//一开始都是指向头节点
 //为节点pnew开辟空间neiocun
 pnew=(pstu*) calloc(1,sizeof(pstu));
 //插入数值
 pnew->num=i;
 if(NULL==*phead)
 {
 ///如果为为节点,新值就等吧与尾指针和头指针
	 *phead=pnew;
	 *ptail=pnew;
 
 }else if(i<(*phead)->num) //解引用是去值,*是一个地址。**为一个值
 {
 //实现头插法
	 
	 pnew->pnext=*phead;//原来的表头作为新节点的next
	 *phead=pnew;//新节点作为头节点

 }
 //完成头插法判断就开始进行中间有序插法
 //接着开始遍历pcur,发现某个点值开始大于新节点的值
 else
 {
   while(pcur!=NULL)
   {
    if(i<pcur->num)//
	{
	  ppre->pnext=pnew;
	  pnew->pnext=pcur;
	  break;//结束要插入的数	
	}
	//==确定好要赋的指针在ppre与pcur之间
	//开始ppre与pcur站在一起
	ppre=pcur;
	//大哥pcur先走一步
	pcur=pcur->pnext;//完成中间插入
   }
 if(NULL==pcur)//pcur为空,说明要插入到表尾
 {
  ppre->pnext=pnew;//新街点赋值给原有的节点
  *ptail=pnew;//新节点变为了尾部节点
 }
 }
}
//打印链表
void list_printf(pstu *phead)
{
	while(phead!=NULL)
	{
	 printf("%d",phead->num);
	 phead=phead->pnext;
	
	}
}
int main()
{
 //声明头指针
	   pstu **phead=NULL,**ptail=NULL;
    	int i;
		while(scanf("%d",&i)!=EOF)
        {
		list_sort_insert(&phead,&ptail,i);
		}
		list_printf(phead);
		system("pause");

}

猜你喜欢

转载自blog.csdn.net/weixin_42145502/article/details/83895817