1. 程式人生 > >第二章作業題2-連結串列-計算機17級 7-3 jmu-ds-單鏈表的基本運算 (15 分)

第二章作業題2-連結串列-計算機17級 7-3 jmu-ds-單鏈表的基本運算 (15 分)

7-3 jmu-ds-單鏈表的基本運算 (15 分)

實現單鏈表的基本運算:初始化、插入、刪除、求表的長度、判空、釋放。 (1)初始化單鏈表L,輸出L->next的值; (2)依次採用尾插法插入元素:輸入分兩行資料,第一行是尾插法需要插入的字元資料的個數,第二行是具體插入的字元資料。 (3)輸出單鏈表L; (4)輸出單鏈表L的長度; (5)判斷單鏈表L是否為空; (6)輸出單鏈表L的第3個元素; (7)輸出元素a的位置; (8)在第4個元素位置上插入‘x’元素; (9)輸出單鏈表L; (10)刪除L的第3個元素; (11)輸出單鏈表L; (12)釋放單鏈表L。

輸入格式:

兩行資料,第一行是尾插法需要插入的字元資料的個數,第二行是具體插入的字元資料。

輸出格式:

按照題目要求輸出

輸入樣例:

5 a b c d e

輸出樣例:

0 a b c d e 5 no c 1 a b c x d e a b x d e

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

typedef int Status;
typedef char ElemType;//要注意不是int

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

Status ListCreate_L(LinkList &CL)
{
    CL = (LinkList)malloc(sizeof(LNode));
    if(!CL)
        exit(OVERFLOW);
    LinkList rear = CL;
    rear->next = NULL;
    return 1;
}

Status ListInsert(LinkList &L,int n)//尾部插入法
{
    LinkList p,rear;
    rear = L;
    for(int i =1;i<=n;i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        if(!p)
            exit(OVERFLOW);
        cin>>p->data;
        p->next = NULL;
        rear->next = p;//尾部插入
        rear = p;
    }
    return 1;
}

void ListPrint(LinkList &L)
{
    LinkList p = L->next;//p指向第一個元素結點
    int flag = 1;
    while(p!=NULL)
    {
        if(flag)
        {
            cout<<p->data;
            flag = 0;
        }
        else
        {
            cout<<" "<<p->data;
        }
        p = p->next;
    }
    cout<<endl;
}

Status ListLength(LinkList &L)
{
    LinkList p = L->next;
    int j = 0;
    while(p)
    {
        p = p->next;
        j++;
    }
    cout<<j<<endl;
    return j;
}

Status JudgeEmpty(LinkList &L)
{
    LinkList p = L->next;
    if(p)
        return false;
    else
        return true;
}

Status GetElem(LinkList &L,int i,ElemType &e)
{
    LinkList p = L->next;
    int j = 1;
    while(p&&j<i)
    {
        p = p->next;
        j++;
    }
    if(j>i||!p)
        return 0;
    e = p->data;
    return 1;
}

Status ListLocate(LinkList &L,ElemType e)
{
    LinkList p = L->next;
    int j = 1;
    while(p&&e!=p->data)
    {
        p = p->next;
        j++;
    }
    if(!p)
        return 0;
    else
        return j;
}

Status ListDelete(LinkList &L,int i,ElemType &e)
{
    LinkList p = L->next,q;
    int j = 1;
    while(p&&j<i-1)
    {
        p = p->next;
        j++;
    }
    if(!p||j>i-1)
        return 0;
    q = p->next;
    p->next = q->next;
    e = q->data;
    free(q);
    return 1;
}

void ListFree(LinkList &L)//最好自己寫free函式
{
    LinkList p = L->next;
    //LinkList rear;
    //rear = L;
    while(p)
    {
        free(p);
        //rear = p;
        p = p->next;
    }
    free(p);
}


Status LinkListInsert(LinkList &L,int pos,ElemType e)
{
    LinkList p = L->next,s;
    int j = 1;
    while(p&&j<pos-1)
    {
        p = p->next;
        j++;
    }
    if(!p&&j>pos-1)
        return 0;
    s = (LinkList)malloc(sizeof(LNode));
    s->data = e;
    s->next =p->next;
    p->next =s;
    return 1;
}




int main()
{
    LinkList L;
    ListCreate_L(L);
    int n;
    cout<<L->next<<endl;
    cin>>n;
    ListInsert(L,n);

    ListPrint(L);

    ListLength(L);

    if(JudgeEmpty(L))
        cout<<"yes"<<endl;
    else
        cout<<"no"<<endl;

    ElemType e;
    GetElem(L,3,e);
    cout<<e<<endl;

    //int posi;
    cout<<ListLocate(L,'a')<<endl;

    LinkListInsert(L,4,'x');
    ++n;

    ListPrint(L);

    ListDelete(L,3,e);
    --n;

    ListPrint(L);

    ListFree(L);
    return 0;
}