课后题

第二章 线性表

2.2.3 线性表的顺序表示 P19
1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
#include <stdio.h>
#define MaxSize 6
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L){
    L.length = 0;
}

int deleteMin(SqList &L){
    if(L.length == 0){
        printf("空表");
        return 9562158;
    }
    if(L.length == 1){
        return L.data[0];
    }
    int min = L.data[0], i = 1, minIndex = 0;
    for ( ; i<L.length ; i++){
        if(L.data[i] < min){
            min = L.data[i];  
            minIndex = i;
        } 
    }
    L.data[minIndex] = L.data[L.length-1];
    L.length--;
    return min;
}

int main(){
    SqList L;
    InitList(L);
    // 插入
    L.data[0] = 8;
    L.data[1] = 4;
    L.data[2] = 6;
    L.data[3] = -2;
    L.data[4] = 2;
    L.data[5] = 1;
    L.length = 6;
    // 函数
    int min = deleteMin(L);
    if(min != 9562158)
        printf("最小值为%d\n", min);
    // 打印
    for(int i=0 ; i<L.length ; i++)
        printf("data[%d] = %d\n", i, L.data[i]);
    return 0;
}
最小值为-2
data[0] = 8
data[1] = 4
data[2] = 6
data[3] = 1
data[4] = 2
2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

奇偶可以都写 i<L.length/2

#include <stdio.h>
#define MaxSize 7
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L){
    L.length = 0;
}

void reverse(SqList &L){
    int i = 0, j = L.length-1,  tmp = 0;
    if(L.length % 2 == 0 ){
        for( ; i<=L.length/2 - 1 ; i++,j--){
            tmp = L.data[i];
            L.data[i] = L.data[j];
            L.data[j] = tmp;
        }
    }
    else {
        for( ; i <(L.length-1)/2  ; i++,j--){
            tmp = L.data[i];
            L.data[i] = L.data[j];
            L.data[j] = tmp;
        }
    }
}

int main(){
    SqList L;
    InitList(L);
    // 插入
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.data[3] = 4;
    L.data[4] = 5;
    L.data[5] = 6;
    L.data[6] = 7;
    L.length = 7;
    // 函数
    reverse(L);
    // 打印
    for(int i=0 ; i<L.length ; i++)
        printf("data[%d] = %d\n", i, L.data[i]);
    return 0;
}
data[0] = 7
data[1] = 6
data[2] = 5
data[3] = 4
data[4] = 3
data[5] = 2
data[6] = 1
3. 对长度为n的顺序表L,编写一个时间复杂度为O(n)、 空间复杂度为0(1)的算法,该算法删除线性表中所有值为x的数据元素。

记录不是x的值;是x的值就跳过

#include <stdio.h>
#define MaxSize 10
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L){
    L.length = 0;
}

void deleteX(SqList &L, int x){
    int i = 0, j = 0;
    for( ; i<L.length ; i++){
        if(L.data[i] != x){
            L.data[j++] = L.data[i];
        }
    }
    L.length = j;
}

int main(){
    SqList L;
    InitList(L);
    // 插入
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.data[3] = 2;
    L.data[4] = 5;
    L.data[5] = 6;
    L.data[6] = 7;
    L.data[7] = 2;
    L.data[8] = 2;
    L.data[9] = 2;
    L.length = 10;
    int x = 2;
    // 函数
    deleteX(L, 2);
    // 打印
    printf("表长为:%d\n", L.length);
    for(int i=0 ; i<L.length ; i++)
        printf("data[%d] = %d\t", i, L.data[i]);
    return 0;
}
表长为:5
data[0] = 1	data[1] = 3	data[2] = 5	data[3] = 6	data[4] = 7	
4. 从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行。

方法二:由于是有序表,所以找到st之间的元素区间,把大于t的元素填补到这段区间里。

#include <stdio.h>
#define MaxSize 10
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L){
    L.length = 0;
}

bool deleteST(SqList &L, int s, int t){
    if(L.length == 0 || s >=t )return false;
    int i = 0, j = 0;
    for( ; i<L.length ; i++){
        if(L.data[i] < s || L.data[i] > t){
            L.data[j++] = L.data[i];
        }
    }
    L.length = j;
    return true;
}

int main(){
    SqList L;
    InitList(L);
    // 插入
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.data[3] = 2;
    L.data[4] = 4;
    L.data[5] = 5;
    L.data[6] = 6;
    L.data[7] = 2;
    L.data[8] = 2;
    L.data[9] = 2;
    L.length = 10;
    int s = 2, t = 4;
    // 函数
    if(deleteST(L, s, t) == false){
        if(s>=t)printf("s需要小于t");
        else printf("表长为0");
        return 0;
    }
    // 打印
    printf("表长为:%d\n", L.length);
    for(int i=0 ; i<L.length ; i++)
        printf("data[%d] = %d\t", i, L.data[i]);
    return 0;
}
表长为:3
data[0] = 1	data[1] = 5	data[2] = 6	

方法二:
方法二

5. 从顺序表中删除其值在给定值s与t之间(包含s和t,要求s < t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行。
4 题方法 1
6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
#include <stdio.h>
#define MaxSize 10
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L){
    L.length = 0;
}

void quchong(SqList &L){
    int i = 1, j = 0;
    for( ; i<L.length ; i++){
        if(L.data[j] != L.data[i]){
            L.data[++j] = L.data[i];
        }
    }
    L.length = j+1;
}

int main(){
    SqList L;
    InitList(L);
    // 插入
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.data[3] = 3;
    L.data[4] = 4;
    L.data[5] = 5;
    L.data[6] = 5;
    L.data[7] = 5;
    L.data[8] = 6;
    L.data[9] = 6;
    L.length = 10;
    // 函数
    quchong(L);
    // 打印
    printf("表长为:%d\n", L.length);
    for(int i=0 ; i<L.length ; i++)
        printf("data[%d] = %d\t", i, L.data[i]);
    return 0;
}
表长为:6
data[0] = 1	data[1] = 2	data[2] = 3	data[3] = 4	data[4] = 5	data[5] = 6	
7.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
#include <stdio.h>
#define MaxSize 1000
typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList &L){
    L.length = 0;
}

void merge(SqList &L1, SqList &L2, SqList &LNew){
    LNew.length = L1.length + L2.length;
    int index1 = 0, index2 = 0, i = 0;
    for( ; index1<L1.length ; index1++){
        if(L1.data[index1] <= L2.data[index2]){
            LNew.data[i++] = L1.data[index1];
        }
        else {
            while(L1.data[index1] > L2.data[index2] && index2 < L2.length){ // 一直大于的情况
                LNew.data[i++] = L2.data[index2++];
            }
            if(index2 >= L2.length)break; // 到底了
            index1--;
        }
    }
    // 没完的记得加进去
    while(index1<L1.length){
        LNew.data[i++] = L1.data[index1++];
    }
    while(index2<L2.length){
        LNew.data[i++] = L2.data[index2++];
    }
}

int main(){
    SqList L1, L2, LNew;
    InitList(L1);
    InitList(L2);
    InitList(LNew);
    // 插入
    L1.data[0] = 1;L1.data[1] = 2;L1.data[2] = 3;L1.data[3] = 3;L1.data[4] = 4;
    L1.data[5] = 5;L1.data[6] = 5;L1.data[7] = 5;L1.data[8] = 6;L1.data[9] = 9;
    L2.data[0] = 1;L2.data[1] = 2;L2.data[2] = 3;L2.data[3] = 3;L2.data[4] = 4;
    L2.data[5] = 5;L2.data[6] = 5;L2.data[7] = 6;L2.data[8] = 7;L2.data[9] = 8;
    L1.length = 10;L2.length = 10;
    // 函数
    merge(L1, L2, LNew);
    // 打印
    printf("表长为:%d\n", LNew.length);
    for(int i=0 ; i<LNew.length ; i++)
        printf("data[%d] = %d\t", i, LNew.data[i]);
    return 0;
}
表长为:20
data[0] = 1	data[1] = 1	data[2] = 2	data[3] = 2	data[4] = 3	data[5] = 3	data[6] = 3	data[7] = 3	data[8] = 4	data[9] = 4	data[10] = 5	data[11] = 5	data[12] = 5	data[13] = 5	data[14] = 5	data[15] = 6	data[16] = 6	data[17] = 7	data[18] = 8	data[19] = 9	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值