4.从有序顺序表中删除其值在给定值S与t之间(要求S<t)的所有元素,若S或t
不合理或顺序表为空,则显示出错信息并退出运行。
#include <stdio.h>
#include <stdlib.h>
#define InitSize 100
typedef int ElemType;
typedef struct
{
ElemType *data;
int length, MaxSize;
} SeqList;
// 初始化动态顺序表
void InitList(SeqList &L)
{
L.data = (ElemType *)malloc((InitSize) * sizeof(int));
L.MaxSize = InitSize;
L.length = 0;
}
// 动态输入
void enterInput(SeqList &L, int length)
{
printf("Please Input:\n");
for (int i = 0; i < length; i++)
{
scanf("%d", L.data + i);
}
L.length = length;
}
// 输出存入的值
void outputShow(SeqList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
}
// 删除其值在给定值S与t之间(要求S<t)的所有元素
bool deletes_t(SeqList &L, int s, int t)
{
int i, j;
if (s > t || L.length == 0)
return false;
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++) // j=i
;
while (j < L.length)
{
L.data[i++] = L.data[j++];
}
L.length = i;
return true;
}
int main()
{
SeqList L;
InitList(L);
enterInput(L, 9);
printf("原来数组为:\n");
outputShow(L);
if (deletes_t(L, 3, 7))
{
printf("删除s-t之间的值为:\n");
outputShow(L);
}
else
printf("\nerror!");
return 0;
}
5.从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,
若s或t不合理或顺序表为空,则显示出错信息并退出运行。
// 无序的情况1:(普遍的线性表)
// 时间复杂度为:O(n)
#include <Stdio.h>
#include <stdlib.h>
#define InitSize 100
typedef int ElemType;
typedef struct
{
ElemType *data;
int length, MaxSize;
} SeqList;
void InitList(SeqList &L)
{
L.data = (ElemType *)malloc((InitSize) * sizeof(int));
L.MaxSize = InitSize;
L.length = 0;
}
void enterInput(SeqList &L, int length)
{
printf("Please Input:\n");
for (int i = 0; i < length; i++)
{
scanf("%d", L.data + i);
L.length = length;
}
}
void showOutput(SeqList &L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
}
// 删除其值在给定值s与t之间(包含s和t)
/*// 方法一:定义k记录s~t之间的数
bool deletes_t(SeqList &L, int s, int t)
{
int k = 0; // 记录不在s~t之间的值
if (s > t || L.length == 0)
return false;
for (int i = 0; i < L.length; i++)
{
if (L.data[i] < s || L.data[i] > t)
L.data[k++] = L.data[i];
}
L.length = k;
return true;
} */
// 方法二:定义k记录不在s~t之间的数
bool deletes_t(SeqList &L, int s, int t)
{
int k = 0;
if (s > t || L.length == 0)
return false;
for (int i = 0; i < L.length; i++)
{
if (L.data[i] > s && L.data[i] <= t)
k++;
else
L.data[i - k] = L.data[i];
}
L.length = L.length - k;
return true;
}
int main()
{
SeqList L;
InitList(L);
enterInput(L, 6);
showOutput(L);
deletes_t(L, 2, 7);
showOutput(L);
return 0;
}
6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同。
#include <Stdio.h>
#include <stdlib.h>
#define InitSize 100
typedef int ElemType;
typedef struct
{
ElemType *data;
int length, MaxSize;
} SeqList;
void InitList(SeqList &L)
{
L.data = (ElemType *)malloc((InitSize) * sizeof(int));
L.MaxSize = InitSize;
L.length = 0;
}
void enterInput(SeqList &L, int length)
{
printf("Please Input:\n");
for (int i = 0; i < length; i++)
{
scanf("%d", L.data + i);
L.length = length;
}
}
void showOutput(SeqList &L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d ", L.data[i]);
}
printf("\n");
}
// 删除所有值重复的元素
/* // 方法一:前一个值与后一个值比较
void del_duplicate(SeqList &L)
{
int i = 0, j = 1;
for (i = 0, j = 1; j < L.length; j++)
{
if (L.data[i] != L.data[j])
{
i++;
L.data[i] = L.data[j];
}
}
L.length = i + 1;
} */
// 方法二:每次判断,同时判断两个,有相同值就进入下一次循环
void del_duplicate(SeqList &L)
{
int i, j;
for (i = 0, j = 0; i < L.length && j < L.length; i++, j++)
{
while (L.data[j] == L.data[j + 1] && j < L.length)
j++;
L.data[i] = L.data[j];
}
L.length = i;
}
int main()
{
SeqList L;
InitList(L);
enterInput(L, 9);
showOutput(L);
del_duplicate(L);
showOutput(L);
return 0;
}