创建单链表,并排序插入一元素后仍有序

本文介绍了一个使用C语言实现的单链表基本操作示例,包括创建、打印、插入结点及排序等功能。通过具体代码展示了如何进行单链表的基本管理和维护。

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

#include<stdio.h>
#include<stdlib.h>
struct node //声明结构体类型名
{
 int data;         //结点存放的数据
 struct node *next;//指向下一个结点的指针
};

struct node *create_slist()//建立单链表的函数,返回的是头结点
{
 int x;
 struct node *head,*s,*r;
 head=(struct node *) malloc(sizeof(struct node));//h为头结点
 r=head;
 scanf("%d",&x);
 while(x!=-1)     //输入数据时以-1作为结束标志
 {
  s=(struct node *)malloc(sizeof(struct node)); //结点申请得到的空间记为s
  s->data=x;  //s中存放的数据是x
  r->next=s;  //r指向的下一个结点的地址是s
  r=s;
  scanf("%d",&x);// 输入单链表的各个节点x
 }
 r->next='\0';// r指向的下一个结点为空时结束
 return head;
}

void print_slist(struct node *h)  //输出单链表的函数,形式参数为头结点
{
 struct node *p; //定义一个结构体指针变量
 p=h->next;      //头结点指向的下一个结点为p
 if(p=='\0')     //如果头结点指向的下一个结点p为空,则输出。。。。。。
  printf("Linklist is null!\n");
 else           //如果不为空字符
 {
  printf("head");
  while(p!='\0')
  {
   printf("->%d",p->data); //输出p的数
   p=p->next;              //p的下一个数
  }
  printf("->end\n");       //输出结束标识符
 }
}

void insert_node(struct node *h,int x)  //插入结点的函数,x为要插入的结点
{
 struct node *s,*p,*q;
 s=(struct node *)malloc(sizeof(struct node)); //为s申请分配空间
 s->data=x;      //结点s的数据是x
 q=h->next;      //q初始值为第一个结点
 p=q->next;       //p初始值为第二个节点(q的下一个结点)
 while(p!='\0')
 {
  if(x<=q->data&&x>=p->data) //当x满足条件时终止循环(条件是:x大于第二个节点小于第一个结点)
  {
   q->next=s;     //在q和P中插入结点
   s->next=p;     //
   break;
  }
  else
  {
   q=p;
   p=p->next;
  }
 }
 if(s->data<=q->data)//如果插入的值比最小值(也是最后一个值)小,则插入在最后面
 {
  q->next=s;
  s->next=p;
 }
 else               //如果插入的值比最大值(也就是第一个值)大,则插入在最前面
 {
  q=h->next;       //q的初始值是第一个结点
  h->next=s;        //把第一个结点给s
  s->next=q;         //s的下一结点是q,即s放在第一位
 }
}

void sort_slist(struct node *h)  //从大到小排序函数
{
 struct node *p,*q,*t;
 t=(struct node *)malloc(sizeof(struct node));//结点node申请分配空间
 q=h->next;
 p=q;
 while(q!='\0')                //利用冒泡排序方法
 {
  p=q->next;
  while(p!='\0')
  {
   if(q->data<=p->data)   //交换p和q的位置
   {
    t->data=q->data;
    q->data=p->data;
    p->data=t->data;
    p=p->next;
   }
   else
    p=p->next;
  }
  q=q->next;
 }
}
void main()
{
 struct node *head;
 int x;                 //x为要插入单链表的结点数据值
 printf("建立slist并初始化,以-1为结束标志:\n");
 head=create_slist();  //调用创建表函数
 sort_slist(head);     //调用单链表排序函数对输入的数进行排序
 print_slist(head);    //调用输出单链表函数输出已排序好的单链表
 printf("输入插入点结点的数据值x=");
 scanf("%d",&x);
 printf("在链表中插入结点\n");
 insert_node(head,x); //调用插入结点函数
 print_slist(head);    //再次调用输出单链表函数
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值