7-1 有序链表的插入(20 分)
已知一个递增有序链表L(带头结点,元素为整数),编写程序将一个新整数插入到L中,并保持L的有序性。其中单链表的类型定义参考如下:
typedef int elementType;
typedef struct lnode
{ elementType data;
struct lnode *next;
}Lnode,* LinkList;
输入格式:
输入分三行
第一行 元素个数
第二行 元素的值,元素间用空格分隔。
第三行 待插入的元素值
输出格式:
在一行中输出有序链表元素值,每个元素前输出一个空格以便与相邻元素分隔。
输入样例:
5
1 3 5 7 9
4
输出样例:
1 3 4 5 7 9
#include <stdio.h>
#include <stdlib.h>
//函数状态码定义
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;//单链表的结构体定义
Status LinkListCreate_CL(LinkList &CL);
void ListPrint_CL(LinkList CL);
Status LinkListInsert_CL(LinkList &CL,ElemType e);
Status LinkListCreate_CL(LinkList &CL)
{
LNode *curPtr, *rearPtr;
CL = (LNode*)malloc(sizeof(LNode));
if(!CL)
exit(OVERFLOW);
CL->next = NULL;
curPtr = CL;
rearPtr = CL;
//头节点的尾指针和当前指针都指向头节点
int TheNumberOfElement;
scanf("%d", &TheNumberOfElement);
for(int i = 0; i < TheNumberOfElement; i++)
{
curPtr = (LNode*)malloc(sizeof(LNode));
if(!curPtr)
exit(OVERFLOW);
scanf("%d", &curPtr->data);
rearPtr->next = curPtr;
rearPtr = curPtr;//连接节点
}
rearPtr->next = NULL;//最后一个节点的尾指针赋空
return OK;
}
void ListPrint_CL(LinkList CL)
{
LNode *p = CL->next;
while(p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
Status LinkListInsert_CL(LinkList &CL,ElemType e)
{
LNode *curPtr = CL->next, *rearPtr = CL, *temPtr;
temPtr = (LNode*)malloc(sizeof(LNode));
if(!temPtr)
exit(OVERFLOW);
temPtr->data = e;
temPtr->next = NULL;
if(curPtr == NULL)
{
rearPtr->next = temPtr;
temPtr->next = NULL;
return OK;
}
while(curPtr)
{
if(curPtr->data >= e)
{
rearPtr->next = temPtr;
temPtr->next = curPtr;
return OK;
}
rearPtr = curPtr;
curPtr = curPtr->next;
}
curPtr->next = temPtr;
temPtr->next = curPtr;
return OK;
}
int main()
{
LinkList CL;
ElemType elem;
if(LinkListCreate_CL(CL) != OK)
{
printf("InitList_Sq: 初始化失败!!!\n");
return -1;
}
scanf("%d", &elem);
LinkListInsert_CL(CL,elem);
ListPrint_CL(CL);
return 0;
}