链表

含有头结点的链表和不含头结点的链表

有和没有的区别在于,我们申请第一个几点时,是否给数据进行初始化。

 

//含有头节点 
Link* head = new Link;
Link* TempLink = head;

for(int i = 1; i < 6; ++i){
    Link* list = new Link;
    list->elem = i;
    list->next = NULL;
    
    TempLink->next = list;
    TempLink = TempList->next;
}

 

 

 

 

//不含头节点
Link* head = new Link;
head->elem = 1;
head->next = NULL
Link* TempLink = head;

for(int i = 1; i < 6; ++i){
    Link* list = new Link;
    list->elem = i;
    list->next = NULL;
    
    TempLink->next = list;
    TempLink = TempList->next;
}

 

 

以及他们在输出时也会有区别,有头结点的需要先TempLink = TempLink->next;在输出TempLink->elem;(先转到储存数据的节点,再输出)

而没有头结点的链表,可以直接输出,在跳到下一个节点。

void Display(Link* p)
{
    Link* temp;
    temp = p;
    while (temp->next != NULL) {
        temp = temp->next;//先跳到下一个节点
        cout << temp->elem << " ";
    }
    cout << endl;
}

void Display(Link* p)
{
    Link* temp;
    temp = p;
    while (temp->next != NULL) {
        cout << temp->elem << " ";
        temp = temp->next;//后跳到下一个节点 
    }
    cout << endl;
}

 

下面都是用没有头结点的链表进行举例

初始化:

  1. 创建首元节点,进行初始化。
  2. 给首元节点一个操作指针节点,进行下面的操作。(相当于两个指针,一个记录当前的首元节点,一个进行后面节点的操作)。
  3. 循环赋值一个新的节点。
  4. 将操作指针节点指向新节点。
  5. 将操作指针节点变为新的节点。
  6. 从步骤3继续执行

插入:

  1. 检查插入位置//后面操作不再写
  2. 循环,将操作指针节点成为插入位置的上一个节点
  3. 创建新节点,初始化插入数据
  4. 将新节点指针指向操作指针存储的下一个节点地址, 将操作指针节点指针指向新节点。

删除:

  1. 循环,操作指针节点成为删除位置的上一个节点。
  2. 将操作指针节点指针指向删除位置指向的节点
  3. 释放删除位置节点

查找:

  1. 循环,查看元素是否相等,返回位置。

更改:

  1. 找到要更改元素
  2. 赋新值
#include <iostream>

using namespace std;

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

Link* InitLink() {
    Link* p = new Link;
    Link* temp = p;

    for (int i = 1; i < 5; ++i) {
        Link* a = new Link;
        a->elem = i;
        a->next = NULL;
        temp->next = a;
        temp = temp->next;
    }

    return p;
}

Link* Insert(Link* p, int elem, int pos) {
    Link* temp = p;
    for (int i = 1; i < pos; ++i) {
        if (temp == NULL) {
            cout << "位置错误" << endl;

            return p;
        }

        temp = temp->next;
    }

    Link* a = new Link;
    a->elem = elem;
    a->next = temp->next;
    temp->next = a;

    return p;
}

Link* Delete(Link* p, int pos) {
    Link* temp = p;
    for (int i = 1; i < pos; ++i) {
        if (temp == NULL) {
            cout << "位置有误" << endl;
            return p;
        }
        temp = temp->next;
    }

    Link* m = temp->next;
    temp->next = temp->next->next;
    delete m;

    return p;
}

int Find(Link* p, int elem) {
    Link* temp = p;
    int n = 1;
    while (temp->next) {
        temp = temp->next;
        if (temp->elem == elem)
            break;
        ++n;
    }

    return n;
}

Link* Alter(Link* p, int elem, int pos) {
    Link* temp = p;
    temp = temp->next;
    for (int i = 1; i < pos; ++i) {
        temp = temp->next;
    }
    temp->elem = elem;

    return p;
}

void Display(Link* p)
{
    Link* temp;
    temp = p;
    while (temp->next != NULL) {
        temp = temp->next;//先跳到下一个节点
        cout << temp->elem << " ";
    }
    cout << endl;
}

int main()
{
    Link* p = InitLink();
    Display(p);

    p = Insert(p, 9, 5);
    Display(p);

    p = Delete(p, 5);
    Display(p);

    int n = Find(p, 3);
    cout << n << endl;

    p = Alter(p, 10, 2);
    Display(p);

    system("PAUSE");
    return 0;
}

 

posted @ 2018-12-21 13:27  Hk_Mayfly  阅读(203)  评论(0编辑  收藏  举报