順序表的總結

#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;
		}
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章