创建一个有序的链表

创建有序链表的基本思路就是在插入一个新节点之前,先按有序查找到新节点应该插入的位置,然后再插入!

 

 

//代码实现环境:windows 7 32bit + MinGW + Sublime Text 3

#include <iostream>
using namespace std;

struct Node
{
    int elem;
    Node *next;
};

void Insert(Node *, int);
void TraverseList(Node *);
void show();

int main(int argc, char const *argv[])
{
    Node *head = new Node;//定义头结点
    head->next = NULL;  

    int n;
    for (int i = 0; i < 10; ++i)//输入10个数用于测试
    {
        cin >> n;
        Insert(head, n);//调用插入函数
    }

    TraverseList(head);//遍历链表
    cout << "\npress any key to see detail" << endl;
    getchar();
    getchar();
    show();
    return 0;
}

void Insert(Node *h, int n)//用头结点和数据作为参数
{
    Node *pre = h;//定义pre表示当前节点的上一个节点
    Node *cur = h->next;//定义cur表示当前,只指向NULL或者head节点后的一串链表

    Node *_new = new Node;//创建新节点
    _new->elem = n;//写入数据

    while (cur && cur->elem > n)//如果表示的当前位置不为空,且它说表示的元素比要插入的数字大,
    {
        pre = cur;//找到一个应该插入的点,记录位置
        cur = cur->next;
    }

    _new->next = cur;//插入节点
    pre->next = _new;
}

void TraverseList(Node *h)
{
    Node *p = h->next;  
    while (p)
    {
        cout << p->elem << " ";
        p = p->next;
    }
}

一个简单图解

一个简单的图解,无聊花很多时间写出来的
+---------------------------------------------------------------------------------------+
|假定输入的数依次是:5 3 7 1                                                               |
|       head node                                                                       |
|        +-------+                                                                      |
|        |       |  传递head到insert函数, insert函数中创建pre指向head                     |
|head--->| unkown|  创建cur指向head->next, 如下---+                                      |
|        |-------|                               |                                      |
|        | NULL  |                               |                                      |
|        |_______|                               |                                      |
|                                                |                                      |
|                            +-------+           |                                      |
|                pre-------->|       |           |                                      |
|                    head--->| unkown|           |                                      |
|                            |-------| <---------+                                      |
|                            | NULL  |                                                  |
|                cur-------->|_______|                                                  |
|                                                                                       |
|                                                                                       |
|                                                                                       |
|节点1(不执行while循环, 应为cur = h->next == NULL)                                        |
|        +-------+                         +-------+                                    |
|        |       |           +-----------> |       |                                    |
|head--->| head  |           |             |  5    |                                    |
|        |-------|           |             |-------|                                    |
|        |    ---|-----------+             |   ----|------> NULL                        |
|        |_______|                         |_______|                                    |
|                                                                                       |
|                                                                                       |
|                                                                                       |
|节点2(执行1次while循环), pre和cur的位置为                                                |
|     +-------+          +-------+               +-------+                              |
|     |       |  head--> |       |    +--------> |       |                              |
|     |   3   |          | unkown|    |  +-----> |   5   |                              |
|     |-------|          |-------|    |  |       |-------|                              |
|     |       |          |   ----|----+  | +---> |   ----|----->NULL                    |
|     |_______|          |_______|       | |     |_______|                              |
|                                  pre---+ |                                            |
|                                  cur-----+                                            |
|                                                                                       |
|                                                                                       |
|                +-------+           +-------+         +-------+                        |
|      head----> |       |    +----->|  5    |    +--->|  3    |                        |
|                | unkown|    |      |       |    |    |       |                        |
|                |-------|    |      |-------|    |    |-------|                        |
|                |   ----|----+      |   ----|----+    |   ----|---->NULL               |
|                |_______|           |_______|         |_______|                        |
|                                                                                       |
|                                                                                       |
|                                                                                       |
|节点3(执行0次while循环,因为7比目前最大的数大),pre和cur的位置为                            |
|    +-------+              +-------+               +-------+                           |
|    |       |   head-----> |       |    +--------> |       |                           |
|    |    7  |        +---> |unkown |    |          |  5    |                           |
|    |-------|        |     |-------|    |          |-------|                           |
|    |       |        | +-->|   ----|----+          |   ----|------->NULL               |
|    |_______|        | |   |_______|               |_______|                           |
|                     | |                                                               |
|               pre---+ |                                                               |
|               cur-----+                                                               |
|                                                                                       |
|                                                                                       |
|          +-------+       +-------+       +-------+       +-------+                    |
|head----> |       |  +--> |   7   |  +--> |   5   |  +--> |   3   |                    |
|          |unkown |  |    |       |  |    |       |  |    |       |                    |
|          |-------|  |    |-------|  |    |-------|  |    |-------|                    |
|          |   ----|--+    |   ----|--+    |   ----|--+    |   ----|---->NULL           |
|          |_______|       |_______|       |_______|       |_______|                    |
|                                                                                       |
|                                                                                       |
|                                                                                       |
|                                                                                       |
| 节点4(执行1次while循环),pre和cur的位置                                                 |
|+-------+       +-------+      +-------+      +-------+       +-------+                |
||       | head->|       |  +-->|  7    |  +-->|   5   |  +--> |   3   |                |
||   3   |       | unkown|  |   |       |  |   |       |  |+-> |       |                |
||-------|       |-------|  |   |-------|  |   |-------|  ||   |-------|                |
||       |       |   ----|--+   |   ----|--+   |   ----|--+|+->|   ----|-->NULL         |
||_______|       |_______|      |_______|      |_______|   ||  |_______|                |
|                                                    pre---+|                           |
|                                                    cur----+                           |
|                                                                                       |
|                                                                                       |
|                                                                                       |
|           +-------+      +-------+      +-------+      +-------+      +-------+       |
|    head-->|       |  +-->|  7    |  +-->|   5   |  +-->|   3   |  +-->|   1   |       |
|           | unkown|  |   |       |  |   |       |  |   |       |  |   |       |       |
|           |-------|  |   |-------|  |   |-------|  |   |-------|  |   |-------|       |
|           |   ----|--+   |   ----|--+   |   ----|--+   |   ----|--+   |   ----|-->NULL|
|           |_______|      |_______|      |_______|      |_______|      |_______|       |
+---------------------------------------------------------------------------------------+

 

 

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值