zoukankan      html  css  js  c++  java
  • 数据结构之单链表(C++版)

    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    typedef string ElemType;
    typedef struct LNode{
    ElemType data; //数据域
    struct LNode *next; //指针域
    }LNode, *SLink;

    void InitList(SLink &L);
    void LocateElem(SLink L);
    void ListInsert(SLink &L);
    void ListDelete(SLink &L);
    void DestroyList(SLink &L);
    void ListLength(SLink L);
    void ListEmpty(SLink L);
    void GetElem(SLink L);
    void MergeList_L();

    int main(void)
    {
    SLink L;
    L = NULL;
    int z;
    cout << "+---------------------------+ ";
    cout << "|----------单链表-----------| " ;
    cout << "+---------------------------+ ";
    cout << "提示:为保证您的操作得到保存,请按正常顺序退出系统^_^ ";
    do
    {
    cout << ' ' << ' ' << ' ' << ' ' <<"-------------------------------- ";
    cout << ' ' << ' ' << ' ' <<"+ 主菜单 | ";
    cout << ' ' << ' ' << ' ' <<"+-------------------------------- ";
    cout << ' ' << ' ' << ' ' <<"+ [1]----单链表初始化 | ";
    cout << ' ' << ' ' << ' ' <<"+ [2]----单链表的定位 | ";
    cout << ' ' << ' ' << ' ' <<"+ [3]----单链表的插入 | ";
    cout << ' ' << ' ' << ' ' <<"+ [4]----单链表的删除 | ";
    cout << ' ' << ' ' << ' ' <<"+ [5]----单链表的销毁 | ";
    cout << ' ' << ' ' << ' ' <<"+ [6]----单链表求表长 | ";
    cout << ' ' << ' ' << ' ' <<"+ [7]----单链表的判空 | ";
    cout << ' ' << ' ' << ' ' <<"+ [8]----单链表的存取 | ";
    cout << ' ' << ' ' << ' ' <<"+ [9]----单链表的归并 | ";
    cout << ' ' << ' ' << ' ' <<"+ [0]----退出系统 | ";
    cout << ' ' << ' ' << ' ' <<"-------------------------------- ";
    cout << "请输入您的选择:";
    cin >> z;
    switch(z)
    {
    case 0 : break;
    case 1 : InitList(L);break;
    case 2 : LocateElem(L);break;
    case 3 : ListInsert(L);break;
    case 4 : ListDelete(L);break;
    case 5 : DestroyList(L);break;
    case 6 : ListLength(L);break;
    case 7 : ListEmpty(L);break;
    case 8 : GetElem(L);break;
    case 9 : MergeList_L();break;
    default:cout << "无效选项!" << ' ';system("pause");
    }
    }
    while(z!= 0);
    }


    //尾插法初始化建立单链表
    void InitList(SLink &L){
    SLink p, r;
    int n, j;
    cout << "请输入单链表元素个数:";
    cin >> n;
    //创建一个带头节点的空链表,L为指向头节点的指针(头指针)
    L = (SLink) malloc (sizeof(LNode));
    r = L;
    if(!L) exit(0); //存储空间分配失败
    cout << "请输入单链表的元素:";
    for(j = 0; j < n; j++)
    {
    p = (SLink) malloc (sizeof(LNode)); //生成新节点
    cin >> p->data; //输入元素值
    r->next = p; r = p; //插入到表头
    }
    r->next = NULL;
    system("pause");
    }//InitList

    void LocateElem(SLink L)
    {
    SLink p;
    ElemType e;
    int j = 0;
    if(L == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表 ";
    system("pause");
    return;
    }
    p = L;
    cout << "请输入要查找的元素:";
    cin >> e;
    while(p && p->data != e)
    {
    j++;
    p = p->next;
    }

    if(p) cout << "所找元素的位置为:" << j; //找到满足判定条件的数据元素为第j个元素
    else cout << "所找的元素不存在"; //该单链表中不存在满足判定的数据元素
    cout << ' ';
    system("pause");
    }//LocateElem

    void ListInsert(SLink &L)
    {
    //在单链表L的第pos个元素之前插入元素e,输出插入元素后的单链表
    SLink p, s, q;
    int pos, j;
    ElemType e;
    if(L == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表" << ' ';
    system("pause");
    return;
    }
    p = L; j = 0;
    cout << "请输入插入节点的位置及插入的元素:";
    cin >> pos >> e;

    while(p &&j < pos - 1)
    { //查找第pos - 1个节点,并令指针p指向该节点
    p = p->next; ++j;
    }//while
    if(!p || j > pos - 1)
    {
    cout << "参数不合法,pos小于1或者大于表长加1 "; //参数不合法,pos小于1或者大于表长加1
    system("pause");
    return;
    }
    s = new LNode;
    if(!s) exit(1); //存储空间失败
    s->data = e; //创建新元素节点
    s->next = p->next; p->next = s; //修改指针
    cout << "插入后的单链表:";
    q = L->next;
    while(q)
    {
    cout << q->data << ' ';
    q = q->next;
    }
    cout << ' ';
    system("pause");
    }//ListInsert

    void ListDelete(SLink &L)
    {
    //删除单链表L的第pos个元素元素,输出删除元素后的顺序表
    SLink p, q, r;
    int pos, j;
    if(L == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表 ";
    system("pause");
    return;
    }
    cout << "请输入删除节点的位置:";
    cin >> pos;
    p = L; j = 0;
    while(p ->next &&j < pos - 1)
    { //寻找第pos个节点,并令指针p指向其前驱
    p = p->next; ++j;
    }//while
    if(!(p->next) || j > pos - 1)
    {
    cout << "删除位置不合法"; //删除位置不合法
    system("pause");
    return;
    }
    q = p->next; p->next = q->next; //修改指针
    delete(q); //释放节点空间
    cout << "删除后的单链表:";
    r = L->next;
    while(r)
    {
    cout << r->data << ' ';
    r = r->next;
    }
    cout << ' ';
    system("pause");
    }//ListDelete

    void DestroyList(SLink &L)
    {
    if(L == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表 ";
    system("pause");
    return;
    }
    //销毁以L为头指针的单链表,释放链表中所有节点的空间
    SLink p;
    while(L)
    {
    p = L;
    L = L->next;
    delete p;
    }//while
    L = NULL; //虽然头节点占有的空间已经释放,但指针变量L中的值没有改变,为安全起见,置L为空,以防止对系统空间的访问
    cout << "链表已销毁" << ' ';
    system("pause");
    }//DestroyList


    void ListLength(SLink L)
    {
    SLink p;
    p = L;
    int j;
    j = 0;
    if(p == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表 ";
    system("pause");
    return;
    }
    while(p)
    {
    p = p->next;
    j++;
    }
    cout << "单链表表长为:" << j - 1 << ' ';
    system("pause");
    }

    void ListEmpty(SLink L)
    {
    if(L == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表 ";
    system("pause");
    return;
    }
    if(L->next == NULL)
    cout << "该单链表表为空 ";
    else
    cout << "该单链表不为空 ";
    system("pause");
    }

    void GetElem(SLink L)
    {
    //若1 <= pos <= lengthList(L),则用e带回指针L指向头节点的单链表中第pos个元素的值且返回函数的值为TRUE,否则返回的值为FALSE
    SLink p;
    ElemType e;
    int pos, j;
    if(L == NULL)
    {
    cout << "链表不存在,请选择1初始化创建链表 ";
    system("pause");
    return;
    }
    cout << "取出单链表元素的位置:";
    cin >> pos;
    p = L->next; //变量初始化,p指向第一个节点
    j = 1;
    while(p && j < pos)
    { //顺节点的指针向后查找,直至p指到第pos个节点或p为空止
    p = p->next;
    ++j;
    }//while
    if(!p || j > pos)
    {
    cout << "链表中不存在第pos个节点 "; //链表中不存在第pos个节点
    system("pause");
    return;
    }
    e = p->data; //取到第pos个元素
    cout << "取出的元素为:" << e << ' ';
    system("pause");
    }//GetElem

    void MergeList_L()
    {
    //按值排序的单链表La,Lb,归并为Lc后也按值排序
    SLink La, Lb, Lc, pa, pb, pc, ra, rb, q;
    int m, n, j;
    cout << "请输入单链表La元素个数:";
    cin >> m;
    La = new LNode;
    ra = La;
    if(!La) exit(0); //存储空间分配失败
    cout << "请输入单链表La的元素:";
    for(j = 0; j < m; j++)
    {
    pa = new LNode; //生成新节点
    cin >> pa->data; //输入元素值
    ra->next = pa; ra = pa; //插入到表头
    }
    ra->next = NULL;
    cout << "请输入单链表Lb元素个数:";
    cin >> n;
    Lb = new LNode;
    rb = Lb;
    if(!Lb) exit(0); //存储空间分配失败
    cout << "请输入单链表Lb的元素:";
    for(j = 0; j < n; j++)
    {
    pb = new LNode; //生成新节点
    cin >> pb->data; //输入元素值
    rb->next = pb; rb = pb; //插入到表头
    }
    rb->next = NULL;
    pa = La->next; pb = Lb->next; Lc = pc = La; q = Lc->next;
    while(pa && pb) //将pa,pb节点按大小一次插入c中
    {
    if(pa->data <= pb->data)
    {
    pc->next = pa; pc = pa; pa = pa->next;
    }
    else
    {
    pc->next = pb; pc = pb; pb = pb->next;
    }
    }
    pc->next = pa ? pa : pb;

    delete Lb; //释放Lb头节点
    j = 0;
    while(j < m + n)
    {
    cout << q->data << ' ';
    q = q->next;
    j++;
    }
    cout << ' ';
    system("pause");
    }//MergeList_L

  • 相关阅读:
    Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
    Docker配置LNMP环境
    Docker安装mysqli扩展和gd扩展
    Docker常用命令
    Ubuntu常用命令
    单例模式的优缺点和使用场景
    ABP 多租户数据共享
    ABP Core 后台Angular+Ng-Zorro 图片上传
    ERROR Error: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as 'standalone' in ngModelOptions.
    AbpCore 执行迁移文件生成数据库报错 Could not find root folder of the web project!
  • 原文地址:https://www.cnblogs.com/wwttsqt/p/7783179.html
Copyright © 2011-2022 走看看