有序链表的插入

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 
#include 

//函数状态码定义
#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;
}



你可能感兴趣的:(c++)