数据结构初学之判断单链表有序

该博客介绍了如何判断单链表是否有序,通过创建、插入、删除等操作展示了链表的基本操作,并提供了代码实现。通过遍历链表比较相邻节点的值来确定链表的有序性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <malloc.h>
#define N 5
typedef int datatype;
typedef struct link_node{
datatype info;
struct link_node *next;

}node;
/*****************************************************/
/*  函数功能:建立一个空的单链表                     */
/*  函数参数:无                                     */
/*  函数返回值:指向node类型变量的指针              */
/*  文件名:slnklist.c,函数名:init()                    */
/******************************************************/
 node *init() /*建立一个空的单链表*/
 {
   return NULL;
 }


node *append()
{node *head,*q,*p;
 datatype x;
 int i;
 q=head=(node *)malloc(sizeof(node));
 scanf("%d",&x);q->info=x;
 for(i=2;i<=5;i++)
  {p=(node *)malloc(sizeof(node));
   scanf("%d",&x);p->info=x;
   q->next=p;
   q=p;}
 q->next=NULL;
 return head;
 }

/****************************************************/
/*  函数功能:输出单链表中各个结点的值              */
/*  函数参数:指向node类型变量的指针head           */
/*  函数返回值:空                                  */
/*  文件名slnklist.c,函数名display()                  */
/*****************************************************/
 void display(node *head)
 {
   node *p;
   int tem; int i = 0, j = 0, k = 0, l = 0;

   p=head->next;

 


while (p->next != NULL) {
tem = p->info;
p = p->next;
if (tem > p->info)
i ++;
else if (tem == p->info)
k ++;
else
l ++;
j ++;
}
if (i+k == j || l+k == j )
printf("yes");
else
printf("not");
}

 


/*****************************************************/
/*  函数功能:在单链表中查找第i个结点的存放地址     */
/*  函数参数:指向node类型变量的指针head,int型变量i*/
/*  函数返回值:指向node类型变量的指针              */
/*  文件名:slnklist.c,函数名:find()                  */
/*****************************************************/
 node *find(node *head,int i)
 {
   int j=1;
   node *p=head;
   if(i<1) return NULL;
   while(p&&i!=j)
   {
     p=p->next;j++;
   }
   return j;
 }


/*****************************************************/
/*  函数功能:单链表第i个结点后插入值为x的新结点   */
/*  函数参数:指向node类型变量的指针head            */
/*            datatype 类型变量x,int型变量i          */
/*  函数返回值:指向node类型变量的指针              */
/* 文件名:slnklist.c,函数名:insert()       */
/*****************************************************/
 node *insert(node *head,datatype x,int i)
 {
   node *p,*q;
   q=find(head,i);/*查找第i个结点*/
   if(!q&&i!=0)
       printf("/n找不到第%d个结点,不能插入%d!",i,x);
   else{
        p=(node*)malloc(sizeof(node));/*分配空间*/
        p->info=x;/*设置新结点*/
        if(i==0){/* 插入的结点作为单链表的第一个结点*/
                  p->next=head;  /*插入(1)*/
                  head=p; /*插入(2)*/
                }
        else {
              p->next=q->next;/*插入(1)*/
              q->next=p;/*插入(2)*/
             }
       }
   return head;
 }


/*****************************************************/
/*  函数功能:在单链表中删除一个值为x的结点         */
/*  函数参数:指向node类型变量的指针head            */
/*            datatype 类型变量x                      */
/*  函数返回值:指向node类型变量的指针              */
/*  文件名:slnklist.c,函数名:dele()                  */
/*****************************************************/
 node *dele(node *head,datatype x)
 {
   node *pre=NULL,*p;
   if(!head) {printf("单链表是空的!");return head;}
   p=head;
   while(p&&p->info!=x)/*没有找到并且没有找完*/
     {pre=p;p=p->next;}/*pre指向p的前驱结点*/
   if(!pre&&p->info==x)/*要删除的是第一个结点*/
     head=head->next;/*删除(1)*/
   else
     pre->next=p->next;
   free(p);
   return head;
 }


 void main()
 {node *L;
  L=init();
  L=append();
  display(L);


  getch();
  }

 

 

 小字体的代码可以删掉的,本我初学。和大家一起分享,有更好的方法的,还望多多指点!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值