单链表及其相关操作(C++)

单链表简要提点

  • 单链表解决了线性表删除或插入的繁琐问题(只需在指定位置做些指针的改变)。
  • 相对于线性表,单链表的查找操作比较复杂,需要依次从头结点依次往后遍历到指定位置。

C++代码实现

#include<iostream>
using namespace std;

typedef struct Node{    // 定义结点
    int date;
    struct Node *next;
}LNode, *LinkList;  

LinkList initList()     // 初始化链表
{
    LinkList head = new LNode;  // 创建头节点
    head->next = nullptr;   // 头节点的next域为空指针
    return head;
}

int isEmpty(LinkList L)     // 判断链表是否为空
{
    return L->next == nullptr;
}

void back_insert(LinkList L, int e)     // 在链表末尾插入元素
{
    LNode* q = new LNode;   // 为节点申请空间
    q->date = e;
    q->next = nullptr;
    if (L->next == nullptr)  // 如果链表为空
    {
        L->next = q;
    }
    else
    {
        LNode* p = L->next; // p初始化为头节点的next节点
        while (p->next != nullptr)
        {
            p = p->next;
        }
        p->next = q;    // 赋值
    }
}

int getElemIndex(LinkList L, int e)     // 查找某个元素所在位置
{
    LNode* p = L->next;     // 这里假设头节点的下标为0
    int i = 1;
    while (p)
    {
        if (p->date == e)   // 查找成功,则返回下标
            return i;
        p = p->next;
        i++;
    }
    cout << "Not exist!" << endl;
    return -1;
}

int getIndexElem(LinkList L, int i)         // 求某个位置的元素
{
    LNode* p = L->next;
    int j = 0;
    while (p && ++j < i)
    {
        p = p->next;
    }
    if (!p || j > i)
    {
        cout << "Index Error!";
        return -1;
    }
    else
        return p->date;
}

void insert_after(LinkList L, int index, int value)     // 在某位置之后插入元素
{
    LNode* p = L->next;
    LNode* q = new LNode;   // 创建一个临时节点
    q->date = value;
    int i = 0;
    while (p&& ++i < index)
    {
        p = p->next;
    }
    if (!p || i > index)
    {
        cout << "Index Error!";
    }
    q->next = p->next;  // q的next域指向p后面的节点
    p->next = q;        // p的next指向q
}

void insert_before(LinkList L, int index, int value)        // 在某位置之前插入元素
{
    LNode* p = L->next;
    LNode* q = new LNode;   // 创建一个临时节点
    int i = 0;
    while (p&& ++i < index)
    {
        p = p->next;
    }
    if (!p || i > index)
    {
        cout << "Index Error!";
    }
    q->next = p->next;  // q的next域指向p后面的节点
    p->next = q;        // p的next指向q
    q->date = p->date;  // 调换数据域
    p->date = value;
}

void delete_node(LinkList L, int index)     // 删除指定位置节点
{
    LNode* p = L;
    LNode* q = p->next;         // 创建一个临时节点q指向p的next
    int j = 0;
    while (q && ++j < index)
    {
        q = q->next;
        p = p->next;
    }
    if (!p || j > index)
    {
        cout << "Index Error!";
    }
    p->next = q->next;
    delete q;       // 释放q
}

void print(LinkList L)      // 显示链表内容
{
    LNode *p = L->next;
    while (p)
    {
        cout << p->date<<" ";
        p = p->next;
    }
    cout << endl;
}

int main()
{
    const int date[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    LinkList myLinkList = new LNode;
    myLinkList = initList();
    if (isEmpty(myLinkList))
        cout << "Empty list, now insert some values... " << endl;
    for (int i = 0;i < 9;i++)
    {
        back_insert(myLinkList, date[i]);
    }
    cout << "Now the linklist contents: " << endl;
    print(myLinkList);
    cout << "The value 6's index is:" << getElemIndex(myLinkList, 6) << endl;
    cout << "The index 6's value is: " << getIndexElem(myLinkList, 6) << endl;
    cout << "Input a number inserting after 6: \n";
    int number;
    cin >> number;
    insert_after(myLinkList, 6, number);
    cout << "Now the Linklist is: " << endl;
    print(myLinkList);
    cout << "Input a number inserting before 6: \n";
    int number1;
    cin >> number1;
    insert_before(myLinkList, 6, number1);
    cout << "Now the Linklist is: " << endl;
    print(myLinkList);
    cout << "Input the index to delete: " << endl;
    int index;
    cin >> index;
    delete_node(myLinkList, index);
    cout << "Now the Linklist is: " << endl;
    print(myLinkList);

    delete myLinkList;
    system("pause");
    return 0;
}

运行结果

Empty list, now insert some values...
Now the linklist contents:
1 2 3 4 5 6 7 8 9
The value 6's index is:6
The index 6's value is: 6
Input a number inserting after 6:
666
Now the Linklist is:
1 2 3 4 5 6 666 7 8 9
Input a number inserting before 6:
555
Now the Linklist is:
1 2 3 4 5 555 6 666 7 8 9
Input the index to delete:
7
Now the Linklist is:
1 2 3 4 5 555 666 7 8 9

猜你喜欢

转载自blog.csdn.net/weixin_40170902/article/details/80593802