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

  • 相关阅读:
    Jquery清除style样式
    合并单元格式
    SQL根据下标,返回split分割后字符串
    js功能比较全面的yyyyMMdd格式的日期验证正则
    DataTable to Json
    List<T>下的Find,FindAll等条件过滤函数的使用方法
    获取iframe内部DOM对象
    PowerDesigner取消Name与Code同步
    再次回归
    最近遇到一个比较有意思的题目
  • 原文地址:https://www.cnblogs.com/wwttsqt/p/7783179.html
Copyright © 2011-2022 走看看