首页 > 编程语言 >C/C++ 单链表的实现(初始化、插入、删除、销毁)

C/C++ 单链表的实现(初始化、插入、删除、销毁)

时间:2023-01-24 22:56:20浏览次数:46  
标签:node 初始化 单链 return LNode C++ next data cout

#include <iostream>
#include <Windows.h>
#define MAX_SIZE 100
using namespace std;
//单链表
typedef struct _LinkList {
    int data;//数据域
    struct _LinkList* next;//指针域
}LNode,*LinkList;
//初始化单链表
bool InitLinkList(LinkList& L) {
    L = new LNode;
    if (!L) return false;
    L->next = NULL;
    return true;
}
//前插法
bool InsertList_front(LinkList& L, LNode *node) {
    if (!L || !node) return false;
    node->next = L->next;
    L->next = node;
    return true;
}
//尾插法
bool InsertList_back(LinkList& L, LNode* node) {
    if (!L || !node) return false;
    LNode* p = NULL;
    p = L;
    while (p->next){
        p = p->next;
    }
    node->next = NULL;
    p->next = node;
    return true;
}
//在单链表的任意位置插入
bool InsertList_casual(LinkList& L, int i, LNode* node) {
    if (!L || !node) return false;
    int j = 0;
    LNode* p = L;
    
    while (p && j < i - 1) {
        p = p->next;
        j++;
    }
    if (!p||j>i-1) {
        return false;
    }
    node->next = p->next;
    p->next = node;
    return true;
}
//根据元素的位置获取元素
bool Get_Elems(LinkList& L,int i,LNode*& node) {
    if (!L || !L->next)return false;
    LNode* p = L->next;
    int j = 1;
    while (p && j < i) { 
        p = p->next;
        j++;
    }
    if (!p || j > i) return false;
    node = p;
    return true;
}
//按值查找元素
bool Find_Elme(LinkList& L,int &index,int &elem) {
    if (!L || !L->next)return false;
    int j = 1;//位置的下标
    LNode* p = L->next;
    while (p&&p->data!=elem) {
        p = p->next;
        j++;
    }
    index = j;
    
    if (!p )return false;

    return true;
}
//按元素的位置删除元素
bool Delete_Elem1(LinkList& L, int index, int &elem) {
    if (!L || !L->next)return false;
    LNode* p = L;
    int j = 0;
    while (p->next&&j<index-1) {
        p = p->next;
        j++;
    }
    if (!p->next || j > index - 1)return false;
    LNode* q = NULL;
    q = p->next;
    elem = q->data;
    p->next = q->next;
    delete q;
    return true;
}
//根据指定的元素删除元素
bool Delete_Elem2(LinkList& L,int elem) {
    if (!L || !L->next)return false;
    LNode* p = L;
    while (p->next) {
        if (p->next->data == elem) {
            LNode* q = p->next;
            p->next = q->next;
            delete q;
            //return true;
        }
        else {
            p = p->next;
        }
    }
    return true;
}
void DestroyList(LinkList& L) {
    LNode* p;
    p = L;
    while (p) {
        L = L->next;
        cout << "删除元素: " << p->data << endl;
        delete p;
        p = L;
    }
    cout << "顺序表的销毁!" << endl;
}
void PrintList(LinkList& L) {
    LNode* p;
    p = L->next;
    while (p) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}
int main() {
    LNode* list = NULL;
    int count1 = 0;//前插法元素个数
    int count2 = 0;//尾插法元素个数
    int count3 = 0;//任意位置插入个数
    int i = 0;//插入的位置
    int e = 0;//要插入的元素
    if (InitLinkList(list)) {
        cout << "单链表初始化成功!" << endl;
    }
    else {
        cout << "单链表初始化失败!" << endl;
    }
    PrintList(list);
    //前插法
    cout << "请输入要插入的元素个数:(前插法)";
    cin >> count1;
    while (count1 > 0) {
        LNode* p1 = NULL;
        p1 = new LNode;
        cout << "请输入要插入的元素:";
        cin >> p1->data;
        if (InsertList_front(list, p1)) {
            cout << "元素 " << p1->data << " 插入成功!" << endl;
        }
        else {
            cout << "元素 " << p1->data << " 插入失败!" << endl;
        }
        count1--;
    }
    PrintList(list);
    //尾插法
    cout << "请输入要插入的元素个数:(尾插法)";
    cin >> count2;
    while (count2 > 0) {
        LNode* p2 = NULL;
        p2 = new LNode;
        cout << "请输入要插入的元素:";
        cin >> p2->data;
        if (InsertList_back(list, p2)) {
            cout << "元素 " << p2->data << " 插入成功!" << endl;
        }
        else {
            cout << "元素 " << p2->data << " 插入失败!" << endl;
        }
        count2--;
    }
    PrintList(list);
    //在任意位置插入
    cout << "请输入要插入的元素个数:(任意位置)";
    cin >> count3;
    while (count3 > 0) {
        LNode* p3 = NULL;
        p3 = new LNode;
        cout << "请输入要插入的元素位置和元素:";
        cin >> i >> p3->data;
        if (InsertList_casual(list,i, p3)) {
            cout << "元素 " << p3->data << " 插入成功!" << endl;
        }
        else {
            cout << "元素 " << p3->data << " 插入失败!" << endl;
        }
        count3--;
    }
    PrintList(list);
    //根据元素位置获取当前的值
    LNode* p4 = NULL;
    cout << "请输入想要查找的元素位置:";
    cin >> i;
    if (Get_Elems(list, i, p4)) {
        cout << "第 " << i << " 个元素是:" << p4->data << endl;
    }
    else {
        cout << "元素获取失败" << endl;
    }
    //按值查找元素
    int elem = 0;
    int index = 0;
    cout << "请输入要查找的元素:";
    cin >> elem;
    if (Find_Elme(list,index, elem)) {
        cout << "元素 " << elem << " 查找成功!" << "在单链表的第 " << index << " 个位置。" << endl;
    }
    else {
        cout << "元素查找失败!" << endl;
    }
    //按元素的位置删除元素
    int element = 0;//要删除的元素
    cout << "请输入要删除的元素的位置:";
    cin >> i;
    if (Delete_Elem1(list, i,element)) {
        cout << "在 " << i << " 处的元素 " << element << " 删除成功!" << endl;
        PrintList(list);
    }
    else {
        cout << "元素删除失败!" << endl;
    }
    //按元素删除元素
    int element2 = 0;
    cout << "请输入要删除的元素:";
    cin >> element2;
    if (Delete_Elem2(list,element2)) {
        cout << "元素 " << element2 << " 删除成功!" << endl;
        PrintList(list);
    }
    else {
        cout << "元素删除失败!" << endl;
    }
    DestroyList(list);

    system("pause");
    return 0;
}

 

标签:node,初始化,单链,return,LNode,C++,next,data,cout
From: https://www.cnblogs.com/smartlearn/p/17066491.html

相关文章

  • gin框架分析二:gin初始化,默认配置实例构建过程
    gin的函数调用流程gin的函数调用过程大概如下图:GIN函数调用过程第一步构建GIN实例,第二步构建GIN路由,第三步则是启动http.server包,坚挺HTTP请求,并将请求处理交给gin框架......
  • C++ 类的成员函数指针
    classdog{intname;public:dog();voidprintname();};dog::dog(){cout<<"dog构造"<<endl;};voiddog::printname(){cout<<"dog"<<endl;......
  • C++之*与**与&的爱恨情仇
      一、解释*和&&在变量定义区,表示引用int&x;&在变量操作区,表示取地址符intx=10,*p=&x;*在变量定义区,表示指针int*x;*在变量操作区,表示解引用int*x;cout<<*x......
  • C++小例子【未更新完】
    题目目录​​题目1:全排列​​​​题目2:三数排序​​​​题目3:1+2+3+...+100=?​​​​题目4:大整数相加​​​​题目5:无零整数​​题目1:全排列全排列用1、2、3三个数字可......
  • 安卓请求后端初始化列表数据
    :1、首先在安卓端实现一个接口,用来接收请求,获取列表数据:publicinterfaceGetListDataInterface{@GET("/listData")Call<List<String>>getListData();}......
  • 算法竞赛向 C++ Standard Library 使用速查
    因网络上STL教程大多零散且缺乏严谨性,本文对算法竞赛所需C++StandardLibrary做了一个较为全面的总结。全文主要参考以下文档:Containerslibrary-cppreference.c......
  • MAC平台上VSCode搭建C++开发环境遭遇问题
    Q1:c_cpp_properties.json文件中的macFrameworkPath参数配置​​官网​​上给定内容如下:{"configurations":[{"name":"Mac","includePath":["${workspa......
  • 父子类内部初始化顺序
    1.静态代码块、代码块、构造函数的加载顺序加载顺序从上到下1.父类静态代码块2.子类静态代码块3.父类代码块4.父类构造函数5.子类代码块6.子类构造函数......
  • C++ 类中花括号 {} 换行的正确写法 All In One
    C++类中花括号{}换行的正确写法AllInOneC++Classcurlybraces{}&linebreakC++Class&ObjectC++类&对象[template-spec]class[ms-decl-spec][......
  • C++堆与栈【cherno课程学习】
    C++的堆与栈当我们程序开始的时,它被分成了一堆不同的内存区域,除了堆和栈还有很多东西,但我们最关心的两个就是堆和栈在应用程序启动后,操作系统要做的就是,他会将整个郑......