数据结构 顺序表的题

部分

#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);



}

王道课后题

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值