您好,欢迎来到画鸵萌宠网。
搜索
您的当前位置:首页hnust 1951 链表实现(第二部分)

hnust 1951 链表实现(第二部分)

来源:画鸵萌宠网

         写的有点水,别介意哈!!

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。

typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型

#define MAXSIZE 100 //链表可能达到的最大长度

typedef struct LNode
{
    ElemType data; //结点的数据域
    struct LNode *next; //结点的指针域
} LNode, *LinkList; //linkList为指向结构体LNode的指针类型

Status InitList(LinkList &L)   //算法2.6 单链表的初始化
{
    //构造一个空的单链表L
    L = new LNode; //生成新结点作为头结点,用头指针L指向头结点
    L->next = NULL; //头结点的指针域置空
    return OK;
}

Status DestroyList(LinkList &L)
{
    /* 初始条件:线性表L已存在。操作结果:销毁线性表L */
    LinkList q;
    while(L)
    {
        q = L->next;
        delete L;
        L = q;
    }
    return OK;
}

int ListLength(LinkList L)
{
    /****在此下面完成代码***************/
    int j=0;
    L=L->next;//这个链表头是没有存数据的
    while(L)
    {
        j++;
        L=L->next;
    }
    return j;
    /***********************************/
}

bool ListEmpty(LinkList L)
{
    /****在此下面完成代码***************/
    return !(L->next);//因为链表头都是存在的,要看他下一位有没有存数据才行
    /***********************************/
}

Status GetElem(LinkList L, int i, ElemType &e)   //算法2.7 单链表的取值
{
    /****在此下面完成代码***************/
    int j=0;
    if(i<1||i>ListLength(L))return 0;//如果小于1或者大于长度,想取也取不到

    while(L&&j<i) //因为后面的L=L->next,所以找到i-1位即可,循环里面就到i位了
    {
        L=L->next;
        j++;
    }
    e=L->data;
    return 1;
    /***********************************/
} //GetElem

int LocateElem(LinkList L, int e)   //略有改动 算法2.8 按值查找
{
    /****在此下面完成代码***************/
    int j=1;
    L=L->next;//链表头无数据
    while(L)
    {
        if(L->data==e)
        {
            return j;//找到了就直接返回去
            break;
        }
        j++;
        L=L->next;
    }
    return 0;//循环结束都没找到,返回0
    /*************************************/
} //LocateElem

Status ListInsert(LinkList &L, int i, ElemType e)   //算法2.9 单链表的插入
{
    /****在此下面完成代码***************/
    if(i<1||i>ListLength(L)+1)return 0;//插入是可以再末尾的,所以可以是长度加1
    LNode *h=L,*p;//L是引用,那就保持他的链表头,用h在他的后面搞事情吧

    int j=0;
    while(h&&j<i-1)//j是到i前面两个空间的,因为还要一次循环,之后就是i前一个空间了
    {
        h=h->next;
        j++;
    }
    p=new LNode;//分配一个结点,把他插到i-1和i之间
    p->data=e;//数值
    p->next=h->next;//把h后面的先接到p后面,这样就是p后有一串链了
    h->next=p;//然后再把p接到h的后面就OK了
    return 1;
    /***********************************/
} //ListInsert

Status ListDelete(LinkList &L, int i)   //算法2.10 单链表的删除
{
    /****在此下面完成代码***************/
    int j=0;
    if(i<1||i>ListLength(L))return 0;//同样,小于1或者大于长度的也没值给你去删嘛
    LNode *h=L;//L不动他,咱动他后面的
    while(h&&j<i-1)//到i前两个位置,因为还有一次循环,循环之后就是i前一个空间了
    {
        h=h->next;
        j++;
    }
    h->next=h->next->next;//我们找到i前一个空间,把i后面的空间接给他,那i不就没有了吗
    return 1;
    /***********************************/
} //ListDelete

void ListPrint(LinkList L)
{
    LNode *p;
    for(p = L->next; p; p = p->next)
        cout << p->data << (p->next ? ' ' : '\n');
}

int main()
{
    int i;
    ElemType e;
    LinkList L;
    string op;
    InitList(L);
    while(cin >> op)
    {
        if(op == "Empty")
            cout << (ListEmpty(L) ? "Empty" : "Not empty") << endl;
        else if(op == "Insert")
        {
            cin >> i >> e;
            if(ListInsert(L, i, e) == ERROR)
                cout << "Insert failed" << endl;
            else
                ListPrint(L);
        }
        else if(op == "Length")
        {
            cout << "List length is " << ListLength(L) << endl;
        }
        else if(op == "GetElem")
        {
            cin >> i;
            if(GetElem(L, i, e) == ERROR)
                cout << "Out of index" << endl;
            else
                cout << "The elem at position " << i << " is " <<  e << endl;
        }
        else if(op == "LocateElem")
        {
            cin >> e;
            i = LocateElem(L, e);
            if(i == 0)
                cout << e << " is not found in list" << endl;
            else
                cout << e  << " is found at the position " << i << endl;
        }
        else if(op == "Delete")
        {
            cin >> i;
            if(ListDelete(L, i) == ERROR)
                cout << "Delete failed" << endl;
            else
                ListPrint(L);
        }
    }
    DestroyList(L);
    return 0;
}

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务