文章目录
第二章 线性表
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