NEFU-数据结构 实验1-线性表

目录

1. 设有一个线性表存放在一个一维数组中的前n个数组元素位置。请编写一个顺序表的程序,将这个线性表原地逆置。(程序题, 10分)

2. 键盘输入一组元素,以0做结束输入的标记,建立一个带头结点的单向链表(无序,且值域为整型),遍历单向链表,显示相应元素。(程序题, 10分)

3. 试编写算法,把单向链表(值域为整型)中元素逆置(不允许申请新的结点空间)。(程序题, 10分)

4.编写在非递减有序链表中插入一个元素(整型),使链表元素仍有序的函数(必须采用函数实现,否则不算成绩),并利用该函数建立一个非递减有序单向链表,之后输出这个有序的单链表。 (程序题, 10分)

5.试编写算法,在单向链表中删除所有的偶数元素结点。链表的创建和题目2要求一样。 (程序题, 10分)

6. 建立两个非递减有序单链表,然后合并成一个非递增有序的单链表。(程序题, 15分)

7. 编写算法建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。(程序题, 10分)

8.采用单向链表实现一元多项式的存储并,实现两个多项式相加,输出结果。 (程序题, 15分)

9. 将两个递增有序的单链表合并成一个递增有序的单链表,要求利用原表空间(注意重复值只保留一个)。输出合并后的单链表。设数据结点的值域为整型(程序题, 10分)


1. 设有一个线性表存放在一个一维数组中的前n个数组元素位置。请编写一个顺序表的程序,将这个线性表原地逆置。(程序题, 10分)

分别输出逆置前的顺序表和逆置后的顺序表。(顺序表的元素类型为整型)

输入:先输入一个整数n,表示顺序表的长度,之后输入n个整数

输出:两行(每个数之间用一个空格分隔)

第一行为原来的顺序表,第二行为逆置后的顺序表

#include <iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

typedef struct
{
    ElemType *elem;
    int length;
}SqList;

Status InitList(SqList &L)
{
    L.elem=new int[MAXSIZE];
    if(!L.elem) exit(-2);
    L.length=0;
    return 1;
}

Status AddElem(SqList L,int n)
{
    int e;
    for(int i=0;i<n;i++)
    {
        cin >> e;
        L.elem[i]=e;
        L.length++;
    }
    return 1;
}

Status print(SqList L,int n)
{
    for(int i=0;i<n;i++)
    {
        cout << L.elem[i] << " ";
    }
    cout << endl;
    return 1;
}

Status nixu(SqList &L,int n)
{
    int sta=0;
    int mid;
    for(int i=1;i<=n/2;i++)
    {
        mid=L.elem[n-i];
        L.elem[n-i]=L.elem[sta];
        L.elem[sta]=mid;
        sta++;
    }
    return 1;
}

int main()
{
    int n;
    SqList L;
    InitList(L);
    cin >> n;
    AddElem(L,n);
    print(L,n);
    nixu(L,n);
    print(L,n);
}

2. 键盘输入一组元素,以0做结束输入的标记,建立一个带头结点的单向链表(无序,且值域为整型),遍历单向链表,显示相应元素。(程序题, 10分)

输入:1 2 3 4 5 6 7 8 0

输出:1 2 3 4 5 6 7 8

#include <iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList(LinkList &L)
{
    LinkList r,s;
    ElemType num;
    L=new LNode;
    L->next=NULL;
    r=L;
    cin >> num;
    while(num!=0)
    {
        s=new LNode;
        s->data=num;
        s->next=NULL;
        r->next=s;
        r=s;
        cin >>num;
    }
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

int main()
{
    LinkList L;
    CreatList(L);
    display(L);
    return 0;
}

3. 试编写算法,把单向链表(值域为整型)中元素逆置(不允许申请新的结点空间)。(程序题, 10分)

输入:输入方式和题目2 一样,以0作为结束输入的标记,元素不一样有序

输出:逆置后的单链表,元素之间用一个空格分隔

#include <iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList(LinkList &L)
{
    LinkList r,s;
    ElemType num;
    L=new LNode;
    L->next=NULL;
    r=L;
    cin >> num;
    while(num!=0)
    {
        s=new LNode;
        s->data=num;
        s->next=NULL;
        r->next=s;
        r=s;
        cin >>num;
    }
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

void nixu(LinkList &h)
{
    LinkList p,q;
    p=h->next;
    q=p->next;
    p->next=NULL;
    while(q!=NULL)
    {
        h->next=q;
        q=q->next;
        h->next->next=p;
        p=h->next;
    }
}

int main()
{
    LinkList L;
    CreatList(L);
    nixu(L);
    display(L);
    return 0;
}

4.编写在非递减有序链表中插入一个元素(整型),使链表元素仍有序的函数(必须采用函数实现,否则不算成绩),并利用该函数建立一个非递减有序单向链表,之后输出这个有序的单链表。 (程序题, 10分)

输入:1 6 4 3 5 8 7 9 0

输出:1 3 4 5 6 7 8 9

#include <iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList(LinkList &L)
{
    L=new LNode;
    L->next=NULL;
}

Status InsertList(LinkList &h,int x)
{
    LinkList r,p,q;
    q=h->next;
    p=h;
    while(q!=NULL&&q->data<x)
    {
        p=q;
        q=q->next;
    }
    r=new LNode;
    r->data = x;
    r->next=q;
    p->next =r;
    return 1;
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

int main()
{
    LinkList L;
    CreatList(L);
    int x;
    cin >> x;
    while(x!=0)
    {
        InsertList(L,x);
        cin >> x;
    }
    display(L);
    return 0;
}

5.试编写算法,在单向链表中删除所有的偶数元素结点。链表的创建和题目2要求一样。 (程序题, 10分)

输入:-11 5 9 8 7 3 1 0

输出:-11 5 9 7 3 1

#include <bits/stdc++.h>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList(LinkList &L)
{
    LinkList r,s;
    ElemType num;
    L=new LNode;
    L->next=NULL;
    r=L;
    cin >> num;
    while(num!=0)
    {
        s=new LNode;
        s->data=num;
        s->next=NULL;
        r->next=s;
        r=s;
        cin >>num;
    }
}

/*
Status InsertList(LinkList &h,int x)
{
    LinkList r,p,q;
    q=h->next;
    p=h;
    while(q!=NULL&&q->data<x)
    {
        p=q;
        q=q->next;
    }
    r=new LNode;
    r->data = x;
    r->next=p->next;
    p->next =r;
    return 1;
}
*/

Status Deleteoushu(LinkList h)
{
    LinkList p,q;
    p=h;
    q=h->next;
    while(q!=NULL)
    {
        if(q->data%2==0)
        {
            p->next =q->next;
            free(q);
            q=p->next;
        }
        else
        {
            p=p->next;
            q=q->next;
        }
    }
    return 1;
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

/*
void nixu(LinkList &h)
{
    LinkList p,q;
    p=h->next;
    q=p->next;
    p->next=NULL;
    while(q!=NULL)
    {
        h->next=q;
        q=q->next;
        h->next->next=p;
        p=h->next;
    }
}
*/

int main()
{
    LinkList L;
    CreatList(L);
    Deleteoushu(L);
    display(L);
    return 0;
}

6. 建立两个非递减有序单链表,然后合并成一个非递增有序的单链表。(程序题, 15分)

注意:建立非递减有序的单链表,需要采用题目4的算法

输入:

1 9 5 7 3 0

2 8 4 6 0

输出:

9 8 7 6 5 4 3 2 1

#include <iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList(LinkList &L)
{
    L=new LNode;
    L->next=NULL;
}

Status InsertList(LinkList &h,int x)
{
    LinkList r,p,q;
    q=h->next;
    p=h;
    while(q!=NULL&&q->data<x)
    {
        p=q;
        q=q->next;
    }
    r=new LNode;
    r->data = x;
    r->next=q;
    p->next =r;
    return 1;
}

void RemakeList(LinkList h1,LinkList h2,LinkList &h3)
{
    LinkList l1,l2,l3,p;
    l1=h1->next;
    l2=h2->next;
    l3=h3;
    if(l1->data > l2->data)
    {
        l3->next=l2;
        l2=l2->next;
    }
    else
    {
        l3->next=l1;
        l1=l1->next;
    }
    l3=l3->next;
    l3->next=NULL;
    while(l2&&l1)
    {
       if(l1->data<l2->data)
       {
           l3->next=l1;
           l1=l1->next;
           l3=l3->next;
       }
       else
       {
           l3->next=l2;
           l2=l2->next;
           l3=l3->next;
       }
    }
    p=(l1!=NULL)?l1:l2;
    while(p)
    {
        l3->next=p;
        p=p->next;
        l3=l3->next;
    }
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

void nixu(LinkList &h)
{
    LinkList p,q;
    p=h->next;
    q=p->next;
    p->next=NULL;
    while(q!=NULL)
    {
        h->next=q;
        q=q->next;
        h->next->next=p;
        p=h->next;
    }
}

int main()
{
    LinkList L1,L2,L3;
    CreatList(L1);
    CreatList(L2);
    CreatList(L3);
    int x;
    cin >> x;
    while(x!=0)
    {
        InsertList(L1,x);
        cin >> x;
    }
    cin >> x;
    while(x!=0)
    {
        InsertList(L2,x);
        cin >> x;
    }
    RemakeList(L1,L2,L3);
    nixu(L3);
    display(L3);
    return 0;
}

7. 编写算法建立的链表,实现将其分解成两个链表,其中一个全部为奇数,另一个全部为偶数(尽量利用已知的存储空间)。(程序题, 10分)

输入:1 2 3 4 5 6 7 8 9 0

输出:

1 3 5 7 9 

2 4 6 8 

#include <iostream>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList1(LinkList &L)
{
    LinkList r,s;
    ElemType num;
    L=new LNode;
    L->next=NULL;
    r=L;
    cin >> num;
    while(num!=0)
    {
        s=new LNode;
        s->data=num;
        s->next=NULL;
        r->next=s;
        r=s;
        cin >>num;
    }
}

void CreatList2(LinkList &L)
{
    L=new LNode;
    L->next=NULL;
}

void ChaifenList(LinkList &h1,LinkList &h2)
{
    LinkList l1,l2,l1p;
    l1=h1->next;
    l1p=h1;
    l2=h2;
    l2->next=NULL;
    while(l1!=NULL)
    {
        if(l1->data%2==0)
        {
            l1p->next=l1->next;
            l2->next=l1;
            l1=l1p->next;
            l2=l2->next;
        }
        else
        {
            l1p=l1p->next;
            l1=l1->next;
        }
    }
    l2->next=NULL;
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

int main()
{
    LinkList L1,L2;
    CreatList1(L1);
    CreatList2(L2);
    ChaifenList(L1,L2);
    display(L1);
    display(L2);
    return 0;
}

8.采用单向链表实现一元多项式的存储并,实现两个多项式相加,输出结果。 (程序题, 15分)

输入说明:
4(请输入第一个一元多项式的项数)
2,2 3,3 5,5 7,7(请输入第一个一元多项式的系数和指数)
5(请输入第二个一元多项式的项数)
-2,2 2,3 4,4 5,7 9,9(请输入第二个一元多项式的系数和指数)

输出:

5*x^3 4*x^4 5*x^5 12*x^7 9*x^9

#include <bits/stdc++.h>
#define MAXSIZE 100

using namespace std;

typedef struct LNode
{
    int coef;
    int expn;
    struct LNode *next;
}LNode,*LinkList;

void CreatPolyn(LinkList &L,int n)
{
    LinkList pre,q,s;
    L=new LNode;
    L->next=NULL;
    for(int i=0;i<n;i++)
    {
        s=new LNode;
        scanf("%d,%d",&s->coef,&s->expn);
        pre=L;
        q=L->next;
        while(q&&q->expn < s->expn)
        {
            pre=q;
            q=q->next;
        }
        s->next=q;
        pre->next=s;
    }
}

void SumList(LinkList &h1,LinkList &h2)
{
    LinkList l1,l2,l3,r;
    int sum;
    l1=h1->next;
    l2=h2->next;
    l3=h1;
    while(l1&&l2)
    {
        if(l1->expn == l2->expn)
        {
            sum=l1->coef + l2->coef;
            if(sum!=0)
            {
                l1->coef=sum;
                l3->next=l1;
                l3=l1;
                l1=l1->next;
                r=l2;
                l2=l2->next;
                delete r;
            }
            else
            {
                r=l1;
                l1=l1->next;
                delete r;
                r=l2;
                l2=l2->next;
                delete r;
            }
        }
        else if(l1->expn < l2->expn)
        {
            l3->next=l1;
            l3=l1;
            l1=l1->next;
        }
        else
        {
            l3->next=l2;
            l3=l2;
            l2=l2->next;
        }
    }
    l3->next=l1?l1:l2;
    delete h2;
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->coef << "*x^" << p->expn << " ";
        p=p->next;
    }
    cout << endl;
}

int main()
{
    LinkList L1,L2;
    int a,b;
    cin >> a;
    CreatPolyn(L1,a);
    cin >> b;
    CreatPolyn(L2,b);
    SumList(L1,L2);
    display(L1);
    return 0;
}

9. 将两个递增有序的单链表合并成一个递增有序的单链表,要求利用原表空间(注意重复值只保留一个)。输出合并后的单链表。设数据结点的值域为整型(程序题, 10分)

输入说明:

输入n个有序的整数(无重复值),以0做结束,分别创建单链表A和B;

输出说明:

输出合并后的单链表,数据之间用一个空格分隔。

#include <bits/stdc++.h>
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;

using namespace std;

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

void CreatList(LinkList &L)
{
    L=new LNode;
    L->next=NULL;
}

Status InsertList(LinkList &h,int x)
{
    LinkList r,p,q;
    q=h->next;
    p=h;
    while(q!=NULL&&q->data<x)
    {
        p=q;
        q=q->next;
    }
    r=new LNode;
    r->data = x;
    r->next=q;
    p->next =r;
    return 1;
}

void RemakeList(LinkList &h1,LinkList &h2,LinkList &h3)
{
    LinkList l1,l2,l3,q;
    l1=h1->next;
    l2=h2->next;
    h3=h1;
    l3=h3;
    while(l1&&l2)
    {
        if(l1->data < l2->data)
        {
            l3->next=l1;
            l3=l1;
            l1=l1->next;
        }
        else if(l1->data > l2->data)
        {
            l3->next=l2;
            l3=l2;
            l2=l2->next;
        }
        else
        {
            l3->next=l1;
            l3=l1;
            l1=l1->next;
            q=l2;
            l2=l2->next;
            free(q);
        }
    }
    if(l1) l3->next=l1;
    else l3->next=l2;
}

void display(LinkList p)
{
    p=p->next;
    while(p!=NULL)
    {
        cout << p->data << " ";
        p=p->next;
    }
    cout << endl;
}

int main()
{
    LinkList L1,L2,L3;
    CreatList(L1);
    CreatList(L2);
    int x;
    cin >> x;
    while(x!=0)
    {
        InsertList(L1,x);
        cin >> x;
    }
    cin >> x;
    while(x!=0)
    {
        InsertList(L2,x);
        cin >> x;
    }
    RemakeList(L1,L2,L3);
    display(L1);
    return 0;
}

### 回答1: 实现线性表逆置的思路一般有以下几种: 1. 借助辅助数组:将原数组元素逆序存放到一个辅助数组,然后再将辅助数组元素逐一放回原数组。这种方法需要额外的空间来存放辅助数组,时间复杂度为O(n)。 2. 就地逆置:从两端分别遍历原数组,将元素交换,直到两个指针相遇。这种方法不需要额外的空间,时间复杂度为O(n)。 3. 递归逆置:将原数组分为前半部分和后半部分,分别递归对两部分进行逆置,然后再将整个数组进行逆置。这种方法需要递归调用,时间复杂度为O(nlogn)。 4. 栈的方式:将原数组元素依次入栈,然后再依次出栈放回到原数组。这种方法需要额外的空间来存放栈,时间复杂度为O(n)。 以上是常见的几种思路,具体实现可以根据实际情况选择合适的方法。 ### 回答2: 实现线性表逆置的思路分为以下几种: 1. 首尾交换法:将线性表的首尾元素依次交换,然后往间逼近,交换相邻位置的元素,直到整个线性表逆置完成。该方法需要额外的空间复杂度为O(1),时间复杂度为O(n)。 2. 就地逆置法:将线性表的所有元素顺序读取,并将第i个元素移动到倒数第i个位置,即将第一个元素和最后一个元素交换,然后将第二个元素和倒数第二个元素交换,以此类推。该方法不需要额外的空间复杂度,时间复杂度为O(n)。 3. 头插法:新建一个空的线性表,从原线性表的头部开始遍历,将元素依次插入线性表的头部。这样,原线性表的头部元素会变为新线性表的尾部元素,原线性表的尾部元素会变为新线性表的头部元素,实现了逆置。该方法需要额外的空间复杂度为O(n),时间复杂度为O(n)。 4. 尾插法:新建一个空的线性表,从原线性表的尾部开始遍历,将元素依次插入线性表的尾部。这样,原线性表的头部元素会变为新线性表的尾部元素,原线性表的尾部元素会变为新线性表的头部元素,实现了逆置。该方法需要额外的空间复杂度为O(n),时间复杂度为O(n)。 以上是实现线性表逆置的几种思路,选择哪种方法主要取决于实际需求和具体场景。 ### 回答3: 实现线性表逆置的思路可以分为以下几种: 1. 逐元素逆置:逐个将线性表元素进行调换位置。可以从线性表的首尾两端开始,依次交换两个位置上的元素,然后向间移动,直至遍历完整个线性表。这种方法相对简单,但对于含有大量元素线性表来说,交换次数较多,效率较低。 2. 头尾指针逆置:使用两个指针分别指向线性表的头部和尾部,然后将两个指针指向的元素进行交换,然后头指针向后移动一位,尾指针向前移动一位,再次进行元素交换,如此循环,直到两个指针相遇。这种方法只需要交换 n/2 次,效率较高。 3. 递归逆置:利用递归函数进行逆置操作。将线性表分为首元素和其余部分两个部分,递归地逆置其余部分,然后将首元素插入逆置后的线性表的末尾即可。这种方法通过递归的方式较为简洁,但需要注意递归的边界条件。 以上是实现线性表逆置的几种思路,使用不同的方法可以根据具体情况选择最适合的方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值