1. 程式人生 > >C++ 線性表順序儲存結構

C++ 線性表順序儲存結構

隨著逐漸學習,更深入的體會了C是面向過程,C++是面向物件這一說法。下面的程式碼用類封裝了一個順序儲存的線性表,僅供參考,有錯誤請指教,畢竟新手。

將元素型別定義為別名,可以方便更改。對於順序表,最基本的操作比如增刪改查可以寫在一個類裡,現在要寫資料元素為int 或者char等,可以繼承這個類,然後再新增獨有的操作,也算是促進程式碼重用?這樣理解不知道對不對

#include <iostream>

using namespace std;
#define MAXSIZE 20
#define ADDSIZE 10
typedef int ElemType;

class SqList
{
public:
	bool InitList();//初始化線性表
	bool DestroyList ();//銷燬線性表
	bool ClearList();//清空線性表.引數什麼時候用指標,什麼時候用引用
	bool IsEmpty();//判斷線性表是否為空
	unsigned int GetLength()const;//獲得線性表長度
	ElemType GetElem(unsigned int i)const;//得到某一個元素
	unsigned int GetMaxLength();//獲得線性表最大長度
	int LocateElem(const ElemType value);//判斷一個元素是否在順序表中
	ElemType PriorElem(const ElemType value);//獲得一個元素前驅
	ElemType NextElem(const ElemType value);//獲得一個元素後繼
	bool ListInsert(int i,const ElemType value);//插入線性表
	bool ListDelete(unsigned int i);//刪除一個元素
	bool ListEnlarge();
private://資料設為私有,通過函式來訪問
	ElemType *p;
	unsigned int length;
	unsigned int maxLength;
};

//線性表初始化
bool SqList::InitList()//為什麼繼承重要
{
	p=new ElemType[MAXSIZE];
	if(p==NULL)
		return false;
	length=0;
	maxLength=MAXSIZE;
	return true;
}

//線性表銷燬
bool SqList::DestroyList()
{
	delete []p;
	p=NULL;//防止野指標的產生
	return true;
}

//清空線性表
bool SqList::ClearList()
{
	SqList::DestroyList();
	length=0;
	return true;
}

//判斷線性表是否為空
bool SqList::IsEmpty()
{
	if(length)
		return true;
	else
		return false;
}

//線性表當前長度
unsigned int SqList::GetLength()const
{
	return length;
}

//獲得第i個元素
ElemType SqList::GetElem(unsigned int i)const//為什麼引數不能是unsigned int,不能判斷unsigned int>-1;函式應該會在不是所有路徑有返回值的情況下自動返回一個值
{
	if(i<length)
		return p[i];
}

unsigned int SqList::GetMaxLength()
{
	return maxLength;
}

//判斷一個元素是否線上性表裡,若在返回下標,不在返回-1
int SqList::LocateElem(const ElemType value)
{
	for(unsigned int i=0;i<length;++i)
	{
		if(value==p[i])
			return i;
	}
	return -1;
}

//獲得一個元素前驅
ElemType SqList::PriorElem(const ElemType value)
{
	int i=LocateElem(value);
	if(i!=-1&&i!=0)
		return p[i-1];
}

//獲得一個元素後繼
ElemType SqList::NextElem(const ElemType value)
{
	int i=LocateElem(value);
	if(i!=-1&&i!=length-1)
		return p[i+1];
}

//插入元素
bool SqList::ListInsert(int i,ElemType value)//新增萬一尺寸不夠擴容
{
	if(length+1>maxLength)
	{
		ListEnlarge();
	}
	else if(i<0)
		return false;
	else
	{
		for(int j=length-1;j>=i;--j)//不要用unsign int 和int 做判斷,判斷unsigned int大於一個負數會出錯
			p[j+1]=p[j];
	}
	p[i]=value;
	++length;
	return true;
}

//刪除元素
bool SqList::ListDelete(unsigned int i)
{
	if(i<0||i>length-1)//先判斷什麼樣子不對,只要有一個條件不滿足就返回,先判斷對,要滿足所有條件
		return false;
	else
	{
		for(unsigned int j=i+1;j<length;++j)
			p[j-1]=p[j];
	}
	--length;
	return true;
}

//擴充線性表
bool SqList::ListEnlarge()//函式內部new的空間不會被回收,但是要保證有指標指向它
{
	ElemType *newp=new ElemType[maxLength+ADDSIZE];
	for(unsigned int i=0;i<length;++i)
	{
		newp[i]=p[i];
	}
	if(!DestroyList())
	{
		return false;
	}
	else
	{
		p=newp;
		maxLength+=ADDSIZE;
		return true;
	}
	return false;
}

//合併兩格登錄檔,去除重複項
void SqListMergeWithoutRepeat(SqList &La,SqList Lb)
{
		for(unsigned int i=0;i<Lb.GetLength();++i)
		{
			if(-1==La.LocateElem(Lb.GetElem(i)))
				La.ListInsert(La.GetLength(),Lb.GetElem(i));
		}	
}

//將兩個按照大小排列的表合併成一個按照大小排列的表
void SqListMergeRemainRepeat(SqList &Lc,const SqList &La,SqList &Lb)
{
	int a=0,b=0,c=0;
	for(;a<La.GetLength()&&b<Lb.GetLength();++c)
	{
		if(La.GetElem(a)<Lb.GetElem(b))
		{
			Lc.ListInsert(c,La.GetElem(a));
			++a;
		}
		else
		{
			Lc.ListInsert(c,Lb.GetElem(b));
			++b;
		}
	}
	while (a<La.GetLength())
	{
		Lc.ListInsert(c,La.GetElem(a));
		++a;
		++c;
	}
	while (b<Lb.GetLength())
	{
		Lc.ListInsert(c,Lb.GetElem(b));
		++b;
		++c;
	}
}
void main()
{
	SqList sql,sql2,sql3;
	sql.InitList();
	sql2.InitList();
	sql3.InitList();
	sql.ListInsert(0,0);
	sql.ListInsert(1,1);
	sql.ListInsert(2,4);
	sql.ListInsert(3,5);
	sql.ListInsert(4,7);
	sql.ListInsert(5,9);
	sql2.ListInsert(0,1);
	sql2.ListInsert(1,4);
	sql2.ListInsert(2,6);
	sql2.ListInsert(3,8);
	sql2.ListInsert(4,9);
	sql2.ListInsert(5,11);
	sql2.ListInsert(6,12);
	//SqListMerge(sql,sql2);
	for(int i=0;i<sql.GetLength();++i)
	{
		ElemType value= sql.GetElem(i);
		cout<<value<<" ";
	}
	cout<<endl;
	for(int i=0;i<sql2.GetLength();++i)
	{
		ElemType value= sql2.GetElem(i);
		cout<<value<<" ";
	}
	cout<<endl;
	SqListMergeRemainRepeat(sql3,sql,sql2);

	for(int i=0;i<sql3.GetLength();++i)
	{
		ElemType value= sql3.GetElem(i);
		cout<<value<<" ";
	}
}

相關推薦

C++ 線性順序儲存結構

隨著逐漸學習,更深入的體會了C是面向過程,C++是面向物件這一說法。下面的程式碼用類封裝了一個順序儲存的線性表,僅供參考,有錯誤請指教,畢竟新手。 將元素型別定義為別名,可以方便更改。對於順序表,最基本的操作比如增刪改查可以寫在一個類裡,現在要寫資料元素為int 或者cha

C++資料結構-線性順序儲存結構設計

線性表的順序儲存結構:指的是用一段地址連續的儲存單元一次儲存線性表中的資料元素,如下: 有了以上概念,我們可以使用一維陣列來實現線性表的順序儲存結構,     儲存空間:T* m_marry     當前長度:int m_length 整個類繼承於之前我們寫的List類,

大話資料結構(一)——線性順序儲存結構的java實現

    在看《大話資料結構》的時候,裡面詼諧的語言和講解吸引了我,但是這本書是用C來實現的,但是作為一個手擼java的人就想著用java來實現一下這些資料結構,於是就有了這些大話資料結構之java實現。哈哈,感覺這樣會讓自己的理解加深不少。 &n

資料結構學習之路----------線性順序儲存結構插入和刪除節點平均移動次數

假設線性表的長度為n。 首先來說線性表順序儲存的插入問題: 線性表元素有n個,那麼插入位置有n+1個。 插入第一個位置需要移動n個,第二個需要移動n-1個,第三個需要移動n-2個。以此類推,總共移動次數為n+(n-1)+(n-2)+...+2+1+0=(n+1)*n/2。

資料結構學習筆記-線性順序儲存C語言實現)

寫了一天,終於將線性表的順序儲存實現了,順便惡補了一下指標內容。順序儲存,適合做查詢,鏈式儲存適合做增刪。新增方法主要就是將線性表從後往前遍歷,依次往後挪一位,直到空出想要插入的位置,刪除方法就是將線性表從要刪除的地方往後遍歷,依次往前挪一位。#include <std

c++資料結構線性儲存結構——順序

順序表,表示線性表的儲存結構為順序儲存,其在使用時會向記憶體中申請一段連續的儲存單元,用單元的下標作為標記位置。其中,資料的型別由於不確定帶來一定的資料型別定義需求,所以我們採用c++的模板來實現。 類模板的定義及相關函式的實現: #pragma

資料結構 --- 線性 順序儲存 鏈式儲存

線性表是平時一直會用到的資料結構,像python裡面的list這種高階資料結構,其實也是對這種底層結構的封裝。 這篇文章寫了整整4天........ 線性表的儲存結構主要分兩大類,一類一類來看。 在這之前,先用虛擬碼來形容一下線性表擁有的基本功能 1 :順序儲存

C/C++線性---順序演算法全解析

課程筆記來源: MOOC網 郝斌資料結構 之前學過一遍資料結構,面試時候真的忘光了,之前去華環讓寫一個簡單的連結串列刪除演算法也是沒有寫出來,想做CS,必須把資料結構學好了,還是再來一遍吧。 -----------------------------------------

線性順序儲存學習

線性表的順序儲存結構: 定義:用一段地址連續的儲存單元一次儲存線性表的資料元素。 /*線性表儲存的相應程式碼: 1.結構程式碼 2.初始化線性表 3.獲得元素操作 4.插入操作 5.刪除操作 6.判斷線性表是否為空 7.線性表清空 8.線性表中元素e首次出現位置 9.

線性順序儲存-練習題3-逆置順序

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

順序(線性順序儲存結構)及C語言實現

1.邏輯結構上呈線性分佈的資料元素在實際的物理儲存結構中也同樣相互之間緊挨著,這種儲存結構稱為線性表的順序儲存結構。 也就是說,邏輯上具有線性關係的資料按照前後的次序全部儲存在一整塊連續的記憶體空間中,之間不存在空隙,這樣的儲存結構稱為順序儲存結構。使用順序儲存結構儲存的資料,第一個元素所在的地

一、(1)C++ 實現簡單的線性順序儲存結構

作為新手,初學C++和資料結構,也想發發博文,分享點自己的學習所得,也請諸位看官幫忙指正,能提提意見是極好的了! 首先呢,我給各位看官講個笑話:一個統計學家在調查了大量的資料後發現,兩個互不串通的人同時帶炸彈上飛機的概率幾乎是零,於是他每次坐飛機都會隨身攜帶一個炸彈。哈哈

1.線性順序儲存結構————順序(包含C語言和C++版本的完整程式)

1.順序表的定義    將表中元素一個接一個的存入一組連續的儲存單元中,這種儲存結構是順序結構,採用順序儲存結構的線性表簡稱為“ 順序表”。    順序表的儲存特點是:只要確定了起始位置,表中任一元素的地址都通過下列公式得到: Loc(ai)=L

數據結構-線性順序存儲(c++)

構造 locate esp str 狀態碼 using list() 順序 頭文件 數據結構-線性表順序存儲(c++) 2018-09-06 List.h //頭文件 1 #define OK 1 2 #define ERRO0R 0 3 #define TR

已知長度為n的線性A採用順序儲存結構,請寫一個時間複雜度為O(n)、空間複雜度為O(1)的演算法,該演算法可刪除線性中所有值為item的資料元素。

語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq

【資料結構】【二】陣列實現的線性(線性順序儲存結構)

資料結構 陣列實現線性表 通過陣列實現了一個簡單的線性表 功能: 在陣列尾部新增元素 在陣列指定位置新增元素 根據下標獲取元素 根據下標刪除元素 根據元素刪除元素 獲取當前陣列長度 判斷當前陣列是否為空 列印陣列元素 public

資料結構---線性順序儲存結構

#include <stdio.h> #define TRUE 1 #define FALSE 0 #define MAXSIZE 19 typedef struct { int data[MAXSIZE]; int length; }linklist

資料結構 筆記:線性順序儲存結構

順序儲存的定義 線性表的順序儲存結構,指的是用一段地址連續的儲存單元一次儲存線性表中的資料元素。 順序儲存結構的元素插入操作 -判斷目標位置是否合法 -將目標位置之後的所有元素後移一個位置 -將新元素插入目標位置 -線性長度加1 順序儲存結構的元素插入示例 bool

資料結構--C語言--已知線性中的元素以值遞增有序排列,並以單鏈儲存結構。試寫一高效演算法,刪除中所有值大於mink且小於maxk的元素

#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define LEN sizeof(struct LNode) struct LNode{ int data;//資料域 struct

線性(二)——順序儲存結構

線性表的順序儲存結構 構造原理 用一組地址連續的儲存單元依次儲存線性表的資料元素,資料元素之間的邏輯關係通過資料元素的儲存位置直接反映。 記做 ( a1,a2,a3,… … , an ) 所謂一個元素的地址是指該元素佔用的若干(連續的)儲存單元的第一個單元的地址。記做LOC(a