部分
#include <stdlib.h>
#include <stdio.h>
#define MaxSaize 100
线性表的静态定义
//typedef struct {
// int data[MaxSaize];
// int length;
//}SqList;
//线性表的动态定义
typedef struct {
int* data;
int length;
int maxsize;
}SqList;
void Init(SqList &S,int x) {
S.data = (int*)malloc(sizeof(int) * MaxSaize);
S.length =x;
S.maxsize = MaxSaize;
//S.data=new int[maxsize];
}
bool Insert(SqList& S,int i,int e) {
if (i<1 || i>S.length)
return false;
if (S.length > MaxSaize)
return false;
for (int j = S.length; j >= i; j--)
{
S.data[j] = S.data[j - 1];
}
S.data[i - 1] = e;
S.length++;
return true;
}
bool Delete(SqList& S, int i, int e) {
if (i<1 || i>S.length)
return false;
if (S.length > MaxSaize)
return false;
for (int j = i; j < S.length; j++) {
S.data[j - 1] = S.data[j];
}
S.length--;
return true;
}
void PrintList(SqList S)
{
int i;
printf("顺序表的储存空间大小为:%d.\n", S.maxsize);
printf("顺序表中共有元素 %d 个,各个元素是:\n", S.length);
for (i = 0; i <= S.length - 1; i++)
{
printf("%d\t", S.data[i]); // printf("%d\t",*(L.elem+i)); 这两语句等价
}
}
void create(SqList& S, int x) {
printf("please input your table number!\n");
for (int i = 0; i < x; i++) {
scanf_s("%d", &S.data[i]);
}
PrintList(S);
}
int LocateElem(SqList& S, int e) {
for (int i = 0; i < S.length; i++) {
if (S.data[i] == e)
return i + 1;
}
return 0;
}
//删除表中元素重复的数值,自己写的
//可行的√
bool DeleteRepeat1(SqList& S) {
//两个指针,如果相同就i停住,一直移动j,如果不同,就让j取代当前i的、
//元素。
printf("now you should delete repeat number!\n");
for (int i = 0; i < S.length; i++) {
for (int j = i + 1; j < S.length; j++) {
if (S.data[i] == S.data[j]) {
for (int k = j; k < S.length; k++) {
S.data[k - 1] = S.data[k];
}
S.length--;
}
}
}
PrintList(S);
return true;
}
//很巧妙,删除顺序表中元素数值重复的元素
bool DeleteRepeat2(SqList& S,SqList& C,SqList& L) {
if (S.length == 0) {
return false;
}
int i, j;
for (i = 0, j = 1; j < S.length; j++) {
if (S.data[i] != S.data[j]) {
i = i + 1;
S.data[i] = S.data[j];
//S.data[++i] = S.data[j];
}
}
S.length = i + 1;
PrintList(S);
return true;
}
//将两个有序表合并为一个大的有序表
bool CombinTable(SqList& S, SqList& C, SqList& L) {
int i = 0;
int k = 0;
int j = 0;
while (i < S.length && j< L.length) {
if (S.data[i] <=L.data[j])
C.data[k++] = S.data[i++];
else
C.data[k++] = L.data[j++];
}
while (i < S.length) {
C.data[k++] = S.data[i++];
}
while (j < L.length) {
C.data[k++] = L.data[j++];
}
C.length = k - 1;
PrintList(C);
return true;
}
bool DeleteSTorder(SqList& S,SqList& C, SqList& L) {
//找到s后的第一个数字,记录位置,找到t后第一个数字记录位置。
//然后让t后第一个数字取代s第一个数字,不断i++,j++,依次取代
int s, t;
int k = 0;
int i = 0;
int j;
printf("now you should delete number between s and t:!\n");
printf("please input s:\n");
scanf_s("%d", &s);
printf("please input t:\n");
scanf_s("%d", &t);
if (s>=t||S.length==0)
return false;
for (i = 0; i < S.length && S.data[i] < s; i++);
if (i >=S.length)
return false;
for ( j = i; j < S.length && S.data[j] <= t; j++);//这个地方一定要注意写分号,不然结果和原来一样的!
for (; j < S.length; i++, j++) {//j要设置为全局,不然就会报错j不是模板
S.data[i] = S.data[j];
}
S.length = i;
printf("that is delete st result:\n");
PrintList(S);
return true;
}
bool DeleteSTdisorder(SqList& S,SqList& C, SqList& L) {
//这个算法思想就是移动不在st之间的数字
//怎么移动呢?通过记录k++来确定i-k的位置,让在这个区间上的数字位置
//别动,让i回退k个单元来取代这个数字
int s, t;
int k = 0;
printf("now you should delete disorder number between s and t:!\n");
printf("please input s:\n");
scanf_s("%d", &s);
printf("please input t:\n");
scanf_s("%d", &t);
if (s >= t || S.length == 0)
return false;
for (int i = 0; i < S.length; i++) {
if (S.data[i] >= s && S.data[i] <= t) {
k++;
}
else
S.data[i - k] = S.data[i];
}
S.length = S.length - k;
PrintList(S);
return true;
}
//折半查找数值为t的元素,找到了就把他和后继元素交换位置,
//找不到就把它插到表内
void SelectHalf(SqList& S,int x) {
int high=x-1, low=0;
int t;
printf("please input x that you want to select!\n");
scanf_s("%d", &t);
int mid;
while (low <= high) {
mid = (high + low) / 2;
if (S.data[mid] == t)
break;
else if (t < S.data[mid])
high = mid - 1;
else
low = mid + 1;
}
//如果查找成功,那么交换x和其后继元素;当x为最后一个元素的时候
//不能交换,所以这里mid!=n-1
if (S.data[mid] == t && mid != x - 1) {
printf("select success!\n");
int a;
a = t;
t = S.data[mid + 1];
S.data[mid + 1] = a;
}
if (low>high) {
printf("select error!");
int i=0;
for ( i = x - 1; i > high; i--)
S.data[i + 1] = S.data[i];
S.data[i + 1] = t;
}
PrintList(S);
}
bool ReverseOneTable(SqList& S, int x) {
int mid = x / 2;
int temp;
for (int i = 0; i < mid; i++) {
temp = S.data[i];
S.data[i] = S.data[x - 1 - i];
S.data[x - 1 - i] = temp;
}
PrintList(S);
return true;
}
//将表内前面和后面逆转
//逆转的核心,实现各个部位的逆转,不局限于整个表
bool Reverse(SqList& S,int left,int right,int x) {
int temp;
if (left >= right || right >= x)
return false;
int mid = (left + right) / 2;
for (int i = 0; i <= mid - left; i++) {
temp = S.data[left + i];
S.data[left + i] = S.data[right - i];
S.data[right - i] = temp;
}
return true;
}
void Exchange(SqList& S, int x) {
printf("please input second line length\n");
int n;
scanf_s("%d", &n);
Reverse(S, 0, x - 1, x);
Reverse(S, 0, n-1, x);
Reverse(S, n, x - 1,x);
PrintList(S);
}
//2010考试题,对线性表循环左移
void CycleLeftReverse(SqList& S,int x) {
printf("input number that you want to letf move:\n");
int p;
scanf_s("%d", &p);
Reverse(S, 0, x - 1, x);
Reverse(S, 0, p - 1, x);
Reverse(S, p, x - 1, x);
PrintList(S);
}
void Practice(SqList& S,SqList& C, SqList& L,int x){
//DeleteRepeat1(S);
//DeleteRepeat2(S,C,L);
//CombinTable(S, C, L);
//删除st之间的元素
//DeleteSTorder(S,C,L);
//DeleteSTdisorder(S, C, L);
//SelectHalf(S, x);
//对表进行逆转,一个是对表进行全部逆转,一个是局部逆转
ReverseOneTable(S,x);
Exchange(S, x);
CycleLeftReverse(S, x);
}
int main() {
SqList S;
SqList L;
SqList C;
int x;
printf("please input your table's length!\n");
scanf_s("%d", &x);
Init(S, x);
create(S, x);
/*cyhprintf("that is second table!\n");
Init(L, x);
create(L, x);
Init(C, 40);
create(C, 10);*/
Practice(S,C,L,x);
}
王道课后题