数据结构-非循环单链表(上)

164 阅读2分钟

非循环单链表相关内容(上)

(本文所用语言为C++,是个人在初学时所整理的部分代码,加上自身的一些理解。)

结点(node)结构:

struct node {
    int data;
    node *next;
};

单链表一个结点由一个数据元素data和指针元素next构成,data用于存放结点node的数据,next用于指向下一个结点,多个结点相连,就构成了一个最基础的链表。

头插法创建单链表:

node *newList_Head() {
    node *s;
    int x;
    node *l = new node;
    l->next = NULL;
    cin >> x;
    while (x != 9999) {
        s = new node;
        s->data = x;
        s->next = l->next;
        l->next = s;
        cin >> x;
    }
    return l;
}

不断输入数据元素,当输入9999时停止输入并生成返回单链表。

头插法创建单链表时,输入数据的顺序和最终生成单链表的元素顺序是相反的。这是因为每一次添加数据时所生成的包含该数据的结点,都会插入到最后一个结点之前,而不是直接插入到链表后面。

(代码最后返回的数据类型是头结点的地址)

尾插法创建单链表:

node *newList_Tail() {
    int x;
    node *l = new node;
    node *s, *r = l;
    cin >> x;
    while (x != 9999) {
        s = new node;
        s->data = x;
        r->next = s;
        r = s;
        cin >> x;
    }
    r->next = NULL;
    return l;
}

不断输入数据元素,当输入9999时停止输入并生成返回单链表。

尾插法创建单链表时,输入数据的顺序,就是最终生成单链表的元素顺序。每一次插入结点的位置,都在前一个结点的后面,同时指向结点的指针也会不断移动,最终形成一个和输入顺序一致的单链表。

做题时可以在不同情况下使用头插法和尾插法,尤其是涉及到链表逆置的相关题目,往往有着很不错的效果。

寻找第i个结点所对应的元素

node *getElem_Pos(node *&l, int i) {
    int n = 1;
    node *s = l;
    s = s->next;
    while (n < i) {
        s = s->next;
        n++;
    }
    return s;
}

从链表表头结点l开始依次向后遍历,直到指针s指向链表l的第i个结点,最终返回的是该结点的地址。