1. 程式人生 > >一維陣列表示順序表 ʕ •ᴥ•ʔ

一維陣列表示順序表 ʕ •ᴥ•ʔ

由於老師課件都是分開寫得 有的變數名出現了差錯 (課件被我們瘋狂吐槽)  然後小編根據昨天昨天室友的講解 寫了這篇比較簡潔的程式碼 需要能夠幫到你們~  大家可以看完我寫的程式碼 然後再去看課件 應該就能看懂  所有連結串列 你只要學會了 插入刪除 其他的都會 由於下午有比賽沒時間寫的太詳細 見諒~~  週一前會更新 還有就是希望各位一定要手動去實現 !!! 光會理論是不行的

#include <iostream>
#include <cstdlib> 
using namespace std;
# define  LIST_INIT_SIZE  100  // 線性表儲存空間的初始分配量
# define   LISTINCREMENT    10  // 線性表儲存空間的分配增量
struct Sqlist{
	int *elem;//儲存空間基址
	int length;//當前表長(特指元素個數)
	int listsize;  //當前分配的儲存容量(以sizeof(ElemType)為單位)
};
// 陣列存取得時候是從0位開始存得 
//構造一個空的線性表L。
int initlist(Sqlist &L)
{
	L.elem=new int[LIST_INIT_SIZE];// 空表長度為0
	L.length=0;
	L.listsize=LIST_INIT_SIZE;// 初始儲存容量
	return 1;
}
//銷燬函式
void destroylist(Sqlist &L)
{
	if(L.elem) delete[] L.elem;//釋放儲存空間
	L.length=0;
	L.listsize=0;
} 
// 清除連結串列 
void ClearList(Sqlist &L)
{
	L.length=0;//將線性表的長度置為0
}
//判空 
int IsEmpty(Sqlist &L)
{
	if(!L.length)// L.length == 0
	return 1;
	return 0;
}
// 求連結串列長度 
int GetLength(Sqlist &L)
{
	return L.length;
 }
//獲取線性表位置的元素
void GetElem(Sqlist &L,int i)
{
	if(i<1||i>L.length)//越界 
	{
		cout<<"輸入不合法"<<endl;
	}
	else
	cout<<L.elem[i-1]<<endl;
}
//獲得前驅
void GetPre(Sqlist &L,int i)
{
	if(i<2||i>L.length+1)
	{
		cout<<"輸入不合法"<<endl;
	}
	else
	cout<<L.elem[i-2]<<endl;
}
//獲得後繼
void GetSuc(Sqlist &L,int i)
{
	if(i<1||i>L.length-1)
	{
		cout<<"輸入不合法"<<endl;
	}
	cout<<L.elem[i]<<endl;
} 
int ListInsert_Sq(Sqlist &L, int i, int e)
{
	if(i<0||i>L.length+1)//越界 
	{
		cout<<"輸入不合法"<<endl;
		return -1;
	}
	if(L.length==L.listsize)//當前儲存空間已滿,增加分配
	{
		int *newbase=(int *)realloc(L.elem,(L.listsize+ LISTINCREMENT)*sizeof(int));
		if(!newbase)
		cout<<"儲存分配失敗"<<endl;
		L.elem=newbase;//新基址
		L.listsize += LISTINCREMENT;//增加儲存容量 
	}
	int *q=&(L.elem[i-1]); //q為插入位置
	for(int *p=&L.elem[L.length-1];p>=q;p--)
	{
		*(p+1)=*p;//插入位置之後的元素右移
	}
	*q=e;//插入e
	++L.length;//長度加一 
	return 1; 
}
//線性表的刪除實現
int  ListDelete_Sq(Sqlist &L,int i)
{
	if(i<1||i>L.length)
	{
		cout<<"輸入不合法"<<endl;
		return -1;
	}
	int *q=&(L.elem[L.length-1]);////p為被刪除元素的位置 
	for(int *p=&(L.elem[i-1]);p<q;p++)
	{
		*p=*(p+1);	//被刪除元素之後的元素左移
	}
	--L.length;	//表長減1
}
//顯示線性表
int Show_Sq(Sqlist &L) 
{
	for(int i=0;i<L.length;i++)
	{
		cout<<L.elem[i]<<endl;
	}
	return 1;
}
void show_help()
{
	cout << "1----清空線性表" << endl;
	cout << "2----判斷線性表是否為空" << endl;
	cout << "3----求線性表長度" << endl;
	cout << "4----獲取線性表指定位置元素" << endl;
	cout << "5----求前驅" << endl;
	cout << "6----求後繼" << endl;
	cout << "7----線上性表指定位置插入元素" << endl;
	cout << "8----刪除線性表指定位置元素" << endl;
	cout << "9----顯示線性表" << endl;
	cout << "     退出,輸出一個負數!" << endl;
}

int main()
{
	int operate_code;
	show_help();
	Sqlist L;
	initlist (L);
	int e,i;
	while(1)
	{
		cout << "請輸入操作程式碼:";
		cin >> operate_code;
		if (operate_code == 1)
		{
			//呼叫操作函式1
			ClearList(L);
			cout << "the list is empty now" << endl;

		}
		else if (operate_code == 2)
		{
			if (IsEmpty(L))
				cout << "The list is empty" << endl;
			else
				cout << "The list is not empty" << endl;
		}
		else if (operate_code == 3)
		{
			cout << "the length of list is:" << GetLength(L) << endl;


		}
		else if (operate_code == 4)
		{
			cout << "請輸入線性表元素的位置:" << endl;
			cin >> i;
			GetElem(L,i);
			
		}
		else if (operate_code == 5)
		{
			cout << "請輸入元素的位置:" << endl;
			cin >> i;
			GetPre(L, i);
		
		}
		else if (operate_code == 6)
		{
			cout << "請輸入元素的位置:" << endl;
			cin >> i;
			GetSuc(L, i);
			
		}
		else if (operate_code == 7)
		{

			cout << "請輸入插入元素及其位置:" << endl;
			cin >> e >> i;
			ListInsert_Sq(L, i, e);
			cout << "e=" << e << " " << "i=" << i << endl;
		}
		
		else if (operate_code == 8)
		{
			cout << "請輸入刪除元素位置:" << endl;
			cin >> i;
			ListDelete_Sq(L, i);
			cout << "已刪除" << endl;

		}
		else if (operate_code == 9)
		{
			Show_Sq(L);
		}
		else if (operate_code<0)
		{
			break;
		}
		else
		{
			cout << "\n操作碼錯誤!!!" << endl;
			show_help();
		}
		
	} 
	//呼叫銷燬線性表函式
	destroylist(L); 
	return 0;
}

一之前會更新完成!