单链表的查找、插入与删除结点

1.单链表查找结点:
①.按序号查找结点值:

什么都不说了,课本上的代码yyds,本来觉得课本上的代码不够完整,自己写着写着就越发觉得课本上的代码极其精妙。

LNode* Get(LinkList L, int i) {
    
    //按序号查找结点值
    int j = 1;//初始为1
    LNode* p = L->next;
    if (i < 0) {
    
    //无效返回空
        return NULL;
    }
    else if (i == 0) {
    
    
        return L;
    }
    while (p && j < i) {
    
    //查找,若i大于表长,返回null
        p = p->next;
        j++;
    }
    return p;
}
②.按值查找表结点:
LNode* LocateElem(LinkList L,int e) {
    
    //按值查找表结点

    int j = 1;
    LNode* p = L->next;

    while (p != NULL && p->data != e) {
    
    
        p = p->next;
        j++;
    }
    return p;
}
2.插入结点操作:
void insert(LNode *s,int i) {
    
    //在序号i处插入结点s

    LNode* p = new LNode;
    p = Get(L, i-1);
    s->next = p->next;
    p->next = s;
}
3.删除结点操作:
void Delete(int i) {
    
    //删除第i个结点

    LNode* p = new LNode;
    p = Get(L, i - 1);

    LNode* q = new LNode;
    q = p->next;
    p->next = q->next;
    free(q);
}
4.运行截图:

在这里插入图片描述

5.完整代码:
#include<bits/stdc++.h>
using namespace std;

typedef struct LNode {
    
    
    int data;
    struct LNode* next;
}LNode, * LinkList;

LinkList L = new LNode;

LinkList List_TailInsert(LinkList& L) {
    
    //尾插法

    L = new LNode;
    LNode* s, * r = L; 
    int x = 1;

    while (x != 10) {
    
    //插入数字1~9
        s = new LNode;
        s->data = x;
        r->next = s;
        r = s;
        x++;
    }
    r->next = NULL;
    return L;
}

void printk(LinkList& L) {
    
    //输出单链表

    LinkList q;
    q = L->next;
    while (q) {
    
    
        cout << q->data << " ";
        q = q->next;
    }
    cout << endl;
}

LNode* Get(LinkList L, int i) {
    
    //按序号查找结点值
    int j = 1;//初始为1
    LNode* p = L->next;
    if (i < 0) {
    
    //无效返回空
        return NULL;
    }
    else if (i == 0) {
    
    
        return L;
    }
    while (p && j < i) {
    
    //查找,若i大于表长,返回null
        p = p->next;
        j++;
    }
    return p;
}

LNode* LocateElem(LinkList L,int e) {
    
    //按值查找表结点

    int j = 1;
    LNode* p = L->next;

    while (p != NULL && p->data != e) {
    
    
        p = p->next;
        j++;
    }
    if (!p) {
    
    
        cout << "没有找到值为e的结点!" << endl;
    }
    else cout << "数值为"<<e<<"的结点序号为:" << j << endl;

    return p;
}

void insert(LNode *s,int i) {
    
    //在序号i处插入结点s

    LNode* p = new LNode;
    p = Get(L, i-1);
    s->next = p->next;
    p->next = s;

    cout << "在第"<<i<<"个结点插入s结点后的输出如下:"<<endl;
    printk(L);
}

void Delete(int i) {
    
    //删除第i个结点

    LNode* p = new LNode;
    p = Get(L, i - 1);

    LNode* q = new LNode;
    q = p->next;
    p->next = q->next;
    free(q);

    cout << "删除第" << i << "个结点后的输出如下:" << endl;
    printk(L);
}

int main() {
    
    


    L = List_TailInsert(L);
    cout << "新建单链表输出如下:" << endl;
    printk(L);
    
    cout << "第三个结点数据元素为:" << Get(L,3)->data << endl;//查找序号为3结点的元素值

    LNode* p = new LNode;
    p = LocateElem(L, 3);//按元素值查找结点序号

    LNode* s = new LNode;
    s->data = 10;

    insert(s, 3);//在序号i处插入结点s

    Delete(3);//删除第i个结点

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43912621/article/details/117484068