数据结构_线性表(习题)

2-1

顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )。

A.110

B.108

C.100

D.120

2-2

在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( )。

A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)

B.在第i个结点后插入一个新结点(1≤i≤n)

C.删除第i个结点(1≤i≤n)

D.将n个结点从小到大排序

2-3

向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为( )。

A.8

B.63.5

C.63

D.7

2-4

链接存储的存储结构所占存储空间( )。

A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针

B.只有一部分,存放结点值

C.只有一部分,存储表示结点间关系的指针

D.分两部分,一部分存放结点值,另一部分存放结点所占单元数

2-5

线性表若采用链式存储结构时,要求内存中可用存储单元的地址( )。

A.必须是连续的

B.部分地址必须是连续的

C.一定是不连续的

D.连续或不连续都可以

2-6

线性表L在( )情况下适用于使用链式结构实现。

A.需经常修改L中的结点值

B.需不断对L进行删除插入

C.L中含有大量的结点

D.L中结点结构复杂

2-7

单链表的存储密度( )。

A.大于1

B.等于1

C.小于1

D.不能确定

2-8

将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( )。

A.n

B.2n-1

C.2n

D.n-1

2-9

在一个长度为n的顺序表中,在第i个元素(1≤i≤n+1)之前插入一个新元素时须向后移动( )个元素。

A.n-i

B.n-i+1

C.n-i-1

D.i

2-10

创建一个包括n个结点的有序单链表的时间复杂度是( )。

A.O(1)

B.O(n)

C.O(n2)

D.O(nlog2​n)

2-11

在单链表中,要将s所指结点插入到p所指结点之后,其语句应为( )。

A.s->next=p+1; p->next=s;

B.(*p).next=s; (*s).next=(*p).next;

C.s->next=p->next; p->next=s->next;

D.s->next=p->next; p->next=s;

2-12

在双向链表存储结构中,删除p所指的结点时须修改指针( )。

A.p->next->prior=p->prior; p->prior->next=p->next;

B.p->next=p->next->next; p->next->prior=p;

C.p->prior->next=p; p->prior=p->prior->prior;

D.p->prior=p->next->next; p->next=p->prior->prior;

2-13

在双向循环链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是( )。

A.p->next=q; q->prior=p; p->next->prior=q; q->next=q;

B.p->next=q; p->next->prior=q; q->prior=p; q->next=p->next;

C.q->prior=p; q->next=p->next; p->next->prior=q; p->next=q;

D.q->prior=p; q->next=p->next; p->next=q; p->next->prior=q;

2-14

已知两个长度分别为m和n的升序链表,若将它们合并为一个长度为m+n的降序链表,则最坏情况下的时间复杂度是( )。[2013-1]

A.O(n)

B.O(m*n)

C.O(min(m,n))

D.O(max(m,n))

2-15

已知一个带头结点的双向循环链表L,结点结构为(prev,data,next),其中,prev和next分别是指向其直接前驱和直接后继结点的指针。现要删除指针p所指的结点,正确的语句序列是( )。[2016-2]

A.p->next->prev=p->prev; p->prev->next=p->prev; free(p);

B.p->next->prev=p->next; p->prev->next=p->next; free(p);

C.p->next->prev=p->next; p->prev->next=p->prev; free(p);

D.p->next->prev=p->prev; p->prev->next=p->next; free(p);

2-16

已知指针h指向一个带头结点的非空单循环链表,结点结构为(data,next),其中next是指向直接后继结点的指针,p是尾指针,q为临时指针。现要删除该链表的第一个元素,正确的语句序列是( )。[2021-1]

A.h->next=h->next->next; q=h->next; free(q);

B.q=h->next; h->next=h->next->next; free(q);

C.q=h->next; h->next=q->next; if(p!=q) p=h; free(q);

D.q=h->next; h->next=q->next; if(p==q) p=h; free(q);

5-1有序表合并

函数merge用于将两个顺序存储的严格递增有序表合并成一个严格递增有序表。如“1,2,3,4”和“2,3,5 ,8,10”合并成“1,2,3,4,5,8,10”。

int merge(int a[], int n1, int b[], int n2, int c[]) // n1为a中元素长度,n2为b中元素长度,返回合并后c中长度
{
    int i = 0, j = 0, k = 0;
    while (i < n1 && j < n2)
    {
        if (a[i] < b[j])
            c[k++] = a[i++];  // 将a[i]的值放入c,并将i自增
        else if (a[i] > b[j])
            c[k++] = b[j++];  // 将b[j]的值放入c,并将j自增
        else  // a[i] == b[j],避免重复,将a[i](或b[j])放入c,i和j都自增
        {
            c[k++] = a[i++];
            j++;
        }
    }

    // 将剩余的a[]中元素放入c[]
    while (i < n1)
        c[k++] = a[i++];

    // 将剩余的b[]中元素放入c[]
    while (j < n2)
        c[k++] = b[j++];

    return k;  // 返回合并后c[]的长度
}

5-2奇偶排序

本题目是程序填空题,完成将一个顺序表中的元素按照奇数在前,偶数在后的方式排序。输入数据以0做结束。

#include <iostream>
using namespace std;
typedef int ElemType;
#define M 100
typedef struct
{
    ElemType data[M];
    int length;
} SeqList;

void ListInit(SeqList &L)
{
    L.length = 0;  // 初始化顺序表长度为0
}

void CreatList(SeqList &L)
{
    int i = 0;
    ElemType x;
    cin >> x;
    while (x)
    {
        L.data[i] = x;  // 将输入的元素存入顺序表
        i++;
        L.length++;  // 每插入一个元素,更新顺序表长度
        cin >> x;    // 继续读取下一个元素
    }
}

void JiOusort(SeqList &L)
{
    int i, j;
    ElemType t;
    i = 0;
    j = L.length - 1;  // 初始化双指针,i从头开始,j从尾部开始
    while (i < j)
    {
        while (i < j && L.data[i] % 2 != 0)
            i++;  // 找到第一个偶数
        while (i < j && L.data[j] % 2 == 0)
            j--;  // 找到最后一个奇数
        if (i < j)
        {
            // 交换奇数和偶数
            ElemType t = L.data[i];
            L.data[i] = L.data[j];
            L.data[j] = t;
        }
    }
}

void OutList(SeqList L)
{
    int i = 0;
    while (i < L.length)
    {
        cout << L.data[i] << " ";  // 输出顺序表中的元素
        i++;
    }
    cout << endl;
}

int main()
{
    SeqList L;
    ListInit(L);  // 初始化顺序表
    CreatList(L);  // 创建顺序表
    JiOusort(L);  // 按奇偶排序
    OutList(L);   // 输出结果
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莹雨潇潇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值