向头指针为 L的有序单链表(从小到大有序)中插入一个结点,使插入后链表仍然有序

时间:2021-01-29 10:48:43
原题:有一个有序单链表(从小到大有序),表头指针为 L ,编写一个函数向该单链表中插入一个元素为 a 的结点,使插入后链表仍然有序。
说明:以下程序先自动生成一个从小到大有序链表,然后要求输入插入结点的数据,再用函数int InSnode(LinkList &L)来实现插入操作,该函数为实现插入操作的核心。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;

int DisplayList(LinkList L)//输出链表中的数据域的值
{
if(L == NULL)
{
printf("链表为空!\n");
return -1;
}
printf("当前链表的数据为:\n");
LinkList p=L;
while(p->next!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("%d\n\n",p->data);
return 1;
}

int Create(LinkList &L)// 生成链表的函数定义
{
int i;
LinkList p=NULL,q=NULL;L=NULL;
for(i=0;i<8;i++)
{
p=(LinkList)malloc(sizeof(LNode));
p->data=13*i+68;//为结点的数据域赋值
if(L == NULL)
L=p;
else
q->next=p;
q=p;
}

if(L != NULL)
{
q->next=NULL;
}
return 1;
}

int InSnode(LinkList L)//插入结点的函数
{
LinkList s,p,q;int a;
printf("请输入你要插入的结点的数据域的值:\n");
scanf("%d",&a);
s=(LinkList)malloc(sizeof(LNode)); //生成要插入的结点
s->data=a;s->next=NULL;
if(L==NULL || a<L->data)//寻找插入位置
{
s->next=L;
L=s;
}
else
{
q=L;p=q->next;
while(p!=NULL && a>p->data)
if(a>p->data)
{
q=p;
p=p->next;
}
s->next=p;
q->next=s;
}
return 1;
}

void main()
{
LinkList L;
Create(L);
DisplayList(L);
InSnode(L);
DisplayList(L);
}