第二章作业题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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值