顺序表的总结

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<iostream>
using namespace std;

#define MAXSIZE 100//多项式可能达到的最大长度
typedef struct{//多项式 非零项的定义(零项不必写)
	float coef;//系数
	int expn;//指数
}Polynomial;
typedef struct{
	Polynomial *elem;//存储空间的基地址
	int length;//多项式中当前项的个数
}SqList;

//初始化
void InitList(SqList &L){
	L.elem = new Polynomial[MAXSIZE];
	L.length = 0;
	return;
}
//取值
bool GetElem(SqList L, int i, Polynomial &e){
	if (i < 1 || i > L.length)return false;
	e = L.elem[i - 1];//elem[1-1]单元存储第i个数据元素
	return true;
}
//查找
int LocateElem(SqList L, Polynomial e){
	for (int i = 0; i < L.length; i++){
		if (e.coef==L.elem[i].coef&&e.expn==L.elem[i].expn)return i+1;//查找成功,返回i+1
	}

	return 0;//失败,返回0
}
//插入
bool InsertList(SqList &L, int i, Polynomial e){
	if (i<1 || i>(L.length + 1)){printf("超出表的范围,"); return false;}//超出表长+1(+1是因为插入后,表长会+1)
	if (L.length == MAXSIZE){ printf("表满,"); return false; }//存储空间满
	for (int j = L.length - 1; j >= i-1; j--)//从最后一项开始往后挪一位,直到第i个元素(第i-1项),给插入到第i个元素(第i-1项)腾位置
		L.elem[j+1] = L.elem[j];
	L.elem[i - 1] = e;//插入
	++L.length;//表长+1
	return true;
}
//删除
bool DeleteList(SqList &L, int i){ //第i个数(第i-1项)
	if (i<1 || i>L.length)return false;
	for (; i < L.length; i++)//从第i+1个数(i项)开始往前挪一位,直到表尾
		L.elem[i - 1] = L.elem[i];
	--L.length;
	return true;
}
//输出顺序表
void WatchList(SqList L){
	if (L.length == 0){
		printf("表空\n");
		return;
	}
	printf("顺序表:系数:");
	for (int i = 0; i < L.length; i++)
		printf("%.1f ", L.elem[i].coef);
	printf("\n顺序表:指数:");
	for (int i = 0; i < L.length; i++)
		printf("%d ", L.elem[i].expn);
	printf("\n");
	return;
}

//op函数使得输入的指令转化为整数为switch所用
typedef enum{init,getelem,locate,insert,del,watch,END,other}OP;
OP op(string a){//将输入的字符串转换成枚举类返回(中的枚举元素其实算是整数)
	if (a == "init")return init;
	else if (a == "get")return getelem;
	else if (a == "locate")return locate;
	else if (a == "insert")return insert;
	else if (a == "delete")return del;
	else if (a == "watch")return watch;
	else if(a=="END")return END;
	else return other;
}
//菜单
void menu(SqList &L){
	string t;
	int i;
	Polynomial e;
	while (1){
		//printf("1.重新初始化(init)2.取值(get)3.查找(locate)4.插入(insert)5.删除(delete)6.查看顺序表(watch)5.结束(END)\n");
		printf("1.(init)2.(get)3.(locate)4.(insert)5.(delete)6.(watch)5.(END)\n");
		cin >> t;
		switch (op(t))
		{
		case init:InitList(L); printf("初始化成功\n"); break;
		case getelem:
			cout << "位置:" ;
			cin >> i;
			if (!GetElem(L, i, e))
				printf("不在表长内\n");
			else
				printf("系数:%f指数:%d\n", e.coef, e.expn);
			break;
		case locate:
			cout << "系数/指数" ;
			cin >> e.coef >> e.expn;
			i = LocateElem(L, e);
			if (i)
				printf("位置在%d\n", i);
			else
				printf("未找到\n");
			break;
		case insert:
			cout << "位置:";
			cin >> i;
			cout << "系数/指数" ;
			cin >> e.coef >> e.expn;
			if (!InsertList(L, i, e))
				printf("插入失败\n");
			break;
		case del:
			cout << "位置:" ;
			cin >> i;
			if (!DeleteList(L, i))
				printf("删除失败\n");
			break;
		case watch:
			WatchList(L);
			break;
		case END:
			return;
		case other:
			printf("WRONG\n");
			break;
		default:
			break;
		}
	}
	
}

int main(){
	SqList L;
	menu(L);
	system("PAUSE");
	return 0;
}

0.结构体

L中存了多项式数组和当前项的个数两个元素
L.elem即代表多项式数组
L.elem[i]即代表第i-1个多项式
L.elem[i].coef即代表第i-1个式子的系数元素

#define MAXSIZE 100//多项式可能达到的最大长度
typedef struct{//多项式 非零项的定义(零项不必写)
	float coef;//系数
	int expn;//指数
}Polynomial;
typedef struct{
	Polynomial *elem;//存储空间的基地址
	int length;//多项式中当前项的个数
}SqList;

1.初始化

new的例子:分配大小为MAXSIZE的存储空间

//初始化
void InitList(SqList &L){
	L.elem = new Polynomial[MAXSIZE];
	L.length = 0;
	return;
}

2.取值

若取到返回true,取得的值用e引用传递带出
若未取到返回false

bool GetElem(SqList L, int i, Polynomial &e){
	if (i < 1 || i > L.length)return false;
	e = L.elem[i - 1];//elem[1-1]单元存储第i个数据元素
	return true;
}

3.查找

int LocateElem(SqList L, Polynomial e){
	for (int i = 0; i < L.length; i++){
		if (e.coef==L.elem[i].coef&&e.expn==L.elem[i].expn)return i+1;//查找成功,返回i+1
	}

	return 0;//失败,返回0
}

4.插入

若超出表长+1(+1是因为插入后,表长会+1)或存储区满则无法插入
若可以插入,从最后一项开始往后挪一位,直到第i个元素(第i-1项),给插入到第i个元素(第i-1项)腾位置

bool InsertList(SqList &L, int i, Polynomial e){
	if (i<1 || i>(L.length + 1)){printf("超出表的范围,"); return false;}//超出表长+1(+1是因为插入后,表长会+1)
	if (L.length == MAXSIZE){ printf("表满,"); return false; }//存储空间满
	for (int j = L.length - 1; j >= i-1; j--)//从最后一项开始往后挪一位,直到第i个元素(第i-1项),给插入到第i项腾位置
		L.elem[j+1] = L.elem[j];
	L.elem[i - 1] = e;//插入
	++L.length;//表长+1
	return true;
}

5.删除

从第i+1个数(i项)开始往前挪一位,直到表尾

bool DeleteList(SqList &L, int i){ //第i个数(第i-1项)
	if (i<1 || i>L.length)return false;
	for (; i < L.length; i++)//从第i+1个数(i项)开始往前挪一位,直到表尾
		L.elem[i - 1] = L.elem[i];
	--L.length;
	return true;
}

6.输出顺序表

void WatchList(SqList L){
	if (L.length == 0){
		printf("表空\n");
		return;
	}
	printf("顺序表:系数:");
	for (int i = 0; i < L.length; i++)
		printf("%.1f ", L.elem[i].coef);
	printf("\n顺序表:指数:");
	for (int i = 0; i < L.length; i++)
		printf("%d ", L.elem[i].expn);
	printf("\n");
	return;
}

菜单

(op函数使得输入的指令转化为整数为switch所用)
enum中的元素实际上相当于整数

//op函数使得输入的指令转化为整数为switch所用
typedef enum{init,getelem,locate,insert,del,watch,END,other}OP;
OP op(string a){//将输入的字符串转换成枚举类返回(中的枚举元素其实算是整数)
	if (a == "init")return init;
	else if (a == "get")return getelem;
	else if (a == "locate")return locate;
	else if (a == "insert")return insert;
	else if (a == "delete")return del;
	else if (a == "watch")return watch;
	else if(a=="END")return END;
	else return other;
}
//菜单
void menu(SqList &L){
	string t;
	int i;
	Polynomial e;
	while (1){
		//printf("1.重新初始化(init)2.取值(get)3.查找(locate)4.插入(insert)5.删除(delete)6.查看顺序表(watch)5.结束(END)\n");
		printf("1.(init)2.(get)3.(locate)4.(insert)5.(delete)6.(watch)5.(END)\n");
		cin >> t;
		switch (op(t))
		{
		case init:InitList(L); printf("初始化成功\n"); break;
		case getelem:
			cout << "位置:" ;
			cin >> i;
			if (!GetElem(L, i, e))
				printf("不在表长内\n");
			else
				printf("系数:%f指数:%d\n", e.coef, e.expn);
			break;
		case locate:
			cout << "系数/指数" ;
			cin >> e.coef >> e.expn;
			i = LocateElem(L, e);
			if (i)
				printf("位置在%d\n", i);
			else
				printf("未找到\n");
			break;
		case insert:
			cout << "位置:";
			cin >> i;
			cout << "系数/指数" ;
			cin >> e.coef >> e.expn;
			if (!InsertList(L, i, e))
				printf("插入失败\n");
			break;
		case del:
			cout << "位置:" ;
			cin >> i;
			if (!DeleteList(L, i))
				printf("删除失败\n");
			break;
		case watch:
			WatchList(L);
			break;
		case END:
			return;
		case other:
			printf("WRONG\n");
			break;
		default:
			break;
		}
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章