zoukankan      html  css  js  c++  java
  • 链式线性表的实现

    可学习的链接:http://zhaoyuqiang.blog.51cto.com/6328846/1165492

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<iostream>
    using namespace std;
    //#include<algorithm>
    //using namespace std;

    #define ERROR 0
    #define OK 1
    #define overflow -2
    #define MAXSIZE 1000

    typedef int ElemType;
    typedef int Status;

    // - - - - - - 线性表的单链表存储结构 - - - - - -

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

    /*Status GreateList_L( LinkList &L,int n )
    {
    // 逆位序输入n个元素的值,建立带表头结点的单链线性表L。
    int i;
    LinkList p;
    L = (LinkList)malloc( sizeof(LNode) );
    L->next = NULL; //先建立一个带头结点的单链表。
    for(i=n;i>0;--i)
    { p = (LinkList)malloc( sizeof(LNode) ); //生成新结点。
    scanf("%d",&p->data); //插入元素值。
    p->next = L->next;
    L->next = p; //插入到表头。
    }
    return OK;
    }*/

    Status GreateList_L( LinkList &L,int n)
    { // 顺序存储n个元素的值,建立带头结点的单链表线性表L。
    int i;
    LinkList p,r;
    L = (LinkList)malloc(sizeof(LNode));// 给头结点申请存储空间。
    L->next = NULL;
    r=L;
    for(i=0;i<n;i++)
    {
    p = (LinkList)malloc(sizeof(LNode));//生成新结点。
    scanf("%d",&p->data); // 插入元素的值。
    p->next = NULL;
    r->next = p;
    r = r->next = p; //即把r指针移动到新开辟的新结点上。
    }
    return OK;
    }

    Status GetElem_L( LinkList L,int i,ElemType &e)
    {
    // L为带头结点的单链表的头指针。
    // 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR。
    int j;
    LinkList p;
    p = L->next; j = 1; //初始化,p指向第一个结点,j为计数器。
    while( p && j < i ) //顺指针向后查找,直到p为指向的第i个元素或p为空。
    {
    p = p->next; ++j;
    }
    if( !p || j>i ) return ERROR; //第i个元素不存在。
    e = p->data; //取第i个元素。
    return OK;
    }

    Status ListInsert_L(LinkList &L,int i,ElemType e)
    {
    //在带头结点的单链线性表L中第i个位置之前插入元素e。
    int j;
    LinkList p,s;
    p = L; j = 0;
    while (p && j<i-1 )
    { p = p->next; ++j; } // 寻找第i-1个结点。
    if( !p || j>i-1 ) return ERROR; //i小于1或者大于表长+1。
    s = ( LinkList ) malloc ( sizeof (LNode) ); //生成新结点。
    s->data = e; s->next = p->next; // 插入L中。
    p->next = s;
    return OK;
    }

    Status ListDelete_L( LinkList &L,int i,ElemType &e )
    {
    // 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值。
    int j;
    LinkList p,q;
    p = L ; j = 0;
    while( p->next && j<i-1 )
    {
    //寻找第i个结点,并令p指向其前驱。
    p = p->next; ++j;
    }
    if( !( p->next )|| j>i-1 ) return ERROR; //删除位置不合理。
    q = p->next; p->next = q->next; //删除并释放结点。
    e = q->data;
    free(q);
    return OK;
    }

    void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)
    {
    // 已知单链线性表La和Lb的元素按值非递减排列。
    // 归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
    LinkList pa,pb,pc;
    pa = La->next ; pb = Lb->next;
    Lc = pc = La; // 用La的头结点作为Lc的头结点。

    while(pa&&pb)
    {
    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; // 插入剩余段。
    free(Lb); // 释放Lb的头结点。
    }


    int main()
    {
    LinkList La,Lb,Lc;
    ElemType elem1,elem2,elem3,elem4;
    int n,m,i;
    cout<<"输入链表La和Lb的长度n和m: ";
    cin>>n>>m;
    cout<<endl;

    cout<<"输入链表La中的n个元素的值: "<<endl;
    GreateList_L(La,n);

    cout<<"输入链表Lb中的m个元素的值: "<<endl;
    GreateList_L(Lb,m);

    cout<<"查找链表La中第3个元素: ";
    GetElem_L(La,3,elem1);
    cout<<elem1<<endl<<endl;

    cout<<"链表La删除了第2个元素后的元素: ";
    ListDelete_L(La,2,elem2);
    for(i=1;i<n;i++)
    {
    GetElem_L(La,i,elem3);
    cout<<elem3<<" ";
    }
    cout<<endl<<endl;

    cout<<"在链表La的第3个位置插入元素100后: ";
    ListInsert_L(La,3,100);
    for(i=1;i<=n;i++)
    {
    GetElem_L(La,i,elem3);
    cout<<elem3<<" ";
    }
    cout<<endl<<endl;
    MergeList_L(La,Lb,Lc);
    for(i=1;i<=n+m;i++)
    {
    GetElem_L(La,i,elem4);
    cout<<elem4<<" ";
    }
    cout<<endl<<endl;
    system("pause");
    return 0;
    }

  • 相关阅读:
    自己定义button
    Google C++ style guide——格式
    杭电1018-Big Number(大数)
    AnyForWeb告诉你什么才是“最好的”编程语言
    Android广播机制分析
    nyoj Wythoff Game(暴力枚举)
    基础搜索入门(二)
    1.1、Libgdx目标和特性
    我在农业2.0的互联网创业思考 (1)
    Python演绎的精彩故事(二)
  • 原文地址:https://www.cnblogs.com/wangmengmeng/p/4701059.html
Copyright © 2011-2022 走看看