欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

往有序链表的插入元素使原链表依旧有序

程序员文章站 2022-07-15 16:02:22
...
/*

    在有序链表中插入元素时,最好设置两个指针,一前一后,
cur指针负责比较大小,pre指针负责定位插入位置的前驱。

【关键点】
(1)3中情况:空链表、第一个值比插入元素大、非空链表&&第一个元素比插入元素小
(2)pre、cur指针的初始值
(3)返回值类型:链表指针TNode*

*/

#include<iostream>
using namespace std;

typedef struct TNode
{
    int data;
    struct TNode *next;
}TNode;

TNode* insertNum(TNode* head, int data)
{
    TNode *node = new TNode;
    node->data = data;
    node->next = NULL;

    //case1:如果是空链表
    if (head == NULL)  
    {
        return node;
    }

    //case2:如果第一个元素就比待插入元素大,直接插入node,并
            //把node设为新的头结点
    if (head->data > data)
    {
        node->next = head;
        return node;
    }


    //case3:如果不是空链表&&第一个元素不比待插入元素大
    TNode* pre = head;   //插入位置的前驱
    TNode* cur = head->next;  //用来比较大小

    while (cur && cur->data < data)  //查找插入位置
    {
        pre = cur; 
        cur = cur->next;
    }  //循环结束后,找打插入位置的前驱pre

    //插入元素
    node->next = cur;
    pre->next = node;

    return head;
}

int main()
{
    int num;
    TNode* head = NULL;
    int A[4] = { 0, 11, 3, 4 };
    for (int i = 0; i < 4; i++)
    {
        head = insertNum(head, A[i]);
    }

    for (TNode* cur = head; cur!=NULL; cur = cur->next)
        cout << cur->data<<endl;

    return 0;
}