01
| 从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Del_Min(SqList *L)
{
if(L->length == 0)
return FALSE;
int i, pos, temp;
for(i=0, pos=0; i < L->length; i++)
if(L->data[pos] > L->data[i])
pos = i;
temp = L->data[pos];
L->data[pos] = L->data[--L->length];
return temp;
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int img = Del_Min(&L);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
printf("%d\n", img);
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
02
|设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
void Reverse(SqList *L)
{
int i, temp;
for(i=0; i < L->length/2; i++)
{
temp = L->data[i];
L->data[i] = L->data[L->length-1-i];
L->data[L->length-1-i] = temp;
}
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
Reverse(&L);
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
03
|对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
void Del_x_1(SqList *L, int x)
{
int i, pos = -1, p_num = 0;
for(i=0; i < L->length; i++)
{
if(L->data[i] == x)
{
if(p_num == 0) pos = i;
p_num ++;
}
else if(L->data[i] != x && pos != -1 && p_num != 0)
{
L->data[pos] = L->data[i];
pos ++;
}
if(pos+p_num == L->length)
{
L->length -= p_num;
}
}
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int x;
scanf("%d", &x);
Del_x_1(&L, x);
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
解法1:用k记录顺序表L中
不等于x
的元素个数(即需要保存的元素个数),扫描时将不等于x的元素移动到下标k的位置,并更新k值。扫描结束后修改L的长度。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Del_x_1(SqList *L, int x)
{
if(L->length == 0) return FALSE;
int i, k = 0;
for(i=0; i < L->length; i++)
{
if(L->data[i] != x)
{
L->data[k] = L->data[i];
k ++;
}
}
L->length = k;
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int x;
scanf("%d", &x);
int img = Del_x_1(&L, x);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
解法2:用k记录顺序表L中
等于x
的元素个数(即需要删除的元素个数), 把边扫描边统计k,并将不等于x的元素前移k个位置。扫描结束后修改L的长度。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Del_x_2(SqList *L, int x)
{
if(L->length == 0) return FALSE;
int i, k = 0;
for(i=0; i < L->length; i++)
{
if(L->data[i] == x)
k ++;
else
L->data[i-k] = L->data[i];
}
L->length -= k;
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int x;
scanf("%d", &x);
int img = Del_x_2(&L, x);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
04
| 从有序顺序表中删除其值在给定s与t之间(要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。
删除元素下标连续
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Del_s_t1(SqList *L, int s, int t)
{
if(s >= t || L->length == 0) return FALSE;
int i, j;
for(i=0; i < L->length && L->data[i] < s; i++);
if(i >= L->length) return FALSE;
for(j=i; j < L->length && L->data[j] <= t; j++);
for( ; j < L->length; i++, j++)
L->data[i] = L->data[j];
L->length = i;
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int s, t;
scanf("%d %d", &s, &t);
int img = Del_s_t1(&L, s, t);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
05
| 从顺序表中删除其值在给定s与t之间(包含s和t,要求s<t)的所有元素,若S或T不合理或顺序表为空,则显示出错信息并退出运行。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Del_s_t1(SqList *L, int s, int t)
{
if(s >= t || L->length == 0) return FALSE;
int i, k=0;
for(i=0; i < L->length; i++)
{
if(L->data[i] < s || L->data[i] > t)
{
L->data[k] = L->data[i];
k++;
}
}
L->length = k;
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int s, t;
scanf("%d %d", &s, &t);
int img = Del_s_t1(&L, s, t);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
06
| 从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE 1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Del_Same(SqList *L)
{
if(L->length == 0) return FALSE;
int i, j;
for(i=0,j=1; j < L->length; j++)
{
if(L->data[j] != L->data[i])
{
L->data[++i] = L->data[j];
}
}
L->length = i + 1;
return TRUE;
}
int main()
{
SqList L;
scanf("%d", &L.length);
for(int i=0; i<L.length; i++)
scanf("%d", &L.data[i]);
int img = Del_Same(&L);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
07
| 将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE 1
typedef struct {
int data[MaxSize];
int length;
} SqList;
int Merge(SqList *L1, SqList *L2, SqList *L)
{
if(L1->length + L2->length > MaxSize) return FALSE;
int i=0, j=0, k=0;
while(i < L1->length && j < L2->length)
{
if(L1->data[i] <= L2->data[j])
L->data[k++] = L1->data[i++];
else
L->data[k++] = L2->data[j++];
}
while(i < L1->length)
L->data[k++] = L1->data[i++];
while(j < L2->length)
L->data[k++] = L2->data[j++];
L->length = k;
return TRUE;
}
int main()
{
SqList L1, L2, L;
scanf("%d", &L1.length);
for(int i=0; i<L1.length; i++)
scanf("%d", &L1.data[i]);
scanf("%d", &L2.length);
for(int i=0; i<L2.length; i++)
scanf("%d", &L2.data[i]);
int img = Merge(&L1, &L2, &L);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i<L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
08
| 已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,···,am)和(b1,b2,···,bn)。编写一个函数,将数组中两个顺序表的位置互换,即:将(b1,b2,···,bn)放在(a1,a2,···,am)的前面。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE 1
typedef struct {
int data[MaxSize];
int length;
} SqList;
void Exchange(SqList *L, int left, int right)
{
int i=left, temp, len = right-left, j=0;
while(j++ < len/2)
{
temp = L->data[i];
L->data[i] = L->data[right-1-i+left];
L->data[right-1-i+left] = temp;
i++;
}
}
int Reverse(SqList *L, int m, int n)
{
if(L->length == 0) return FALSE;
else
{
Exchange(L, 0, L->length);
Exchange(L, 0, n);
Exchange(L, n, L->length);
}
return TRUE;
}
int main()
{
SqList L;
int m, n, i;
scanf("%d %d", &m, &n);
L.length = m + n;
for(i=0; i < L.length; i++)
scanf("%d", &L.data[i]);
int img = Reverse(&L, m, n);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i < L.length; i++)
printf("%d ", L.data[i]);
return 0;
}
09
| 线性表(a1,a2,···,an)中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找数值为x的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中并使表中元素仍递增有序。
最少时间,则折半查找
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define FALSE -1
#define TRUE 1
typedef struct {
int data[MaxSize];
int length;
} SqList;
void p(SqList *L)
{
for(int i=0; i < L->length; i++)
printf("%d ", L->data[i]);
printf("\n");
}
int SearchExchangeInsert(SqList *L, int x)
{
if(L->length == 0) return FALSE;
int low=0, high = L->length-1, mid, temp;
while(low <= high)
{
mid = (low + high) / 2;
if(L->data[mid] == x)
break;
else if(L->data[mid] < x)
low = mid + 1;
else
high = mid - 1;
}
if(L->data[mid] == x && mid != L->length-1)
{
temp = L->data[mid];
L->data[mid] = L->data[mid+1];
L->data[mid+1] = temp;
}
int i;
if(low > high)
{
for(i = L->length-1; i > high; i--)
{
L->data[i+1] = L->data[i];
}
L->data[i+1] = x;
L->length ++;
}
return TRUE;
}
int main()
{
SqList L;
int x;
scanf("%d", &L.length);
for(int i=0; i < L.length; i++)
scanf("%d", &L.data[i]);
scanf("%d", &x);
int img = SearchExchangeInsert(&L, x);
if(img == FALSE)
{
printf("error!\n");
exit(0);
}
for(int i=0; i < L.length; i++)
printf("%d ", L.data[i]);
return 0;
}