1. 程式人生 > >【資料結構】定長順序表

【資料結構】定長順序表

【資料結構】順序表

關於基礎資料結構,分為兩類:

①線性:陣列、連結串列、順序表

②非線性:樹、圖

順序表和連結串列的區別:

順序表:邏輯連續、物理連續

連結串列:邏輯連續、物理不一定連續

順序表可細分為兩類:

①定長順序表(在棧內操作)

②不定長順序表(可擴容,在堆內操作)

↑因此順序表一般都通過建立陣列來建立。

此篇部落格專門針對定長順序表做一些操作!!

初始化:

void InitList(PSeqList pl)
{
	assert(pl != NULL);
	if(pl == NULL)
	{
		return ;
	}
	pl ->cursize =0;//將初始長度置為0
}

初始化長度為0

按位插入:

//按位插入
int InsertPos(PSeqList pl,int pos,ELEM_TYPE val)
{
	if(pl == NULL)
	{
		return ;
	}
	if(pos<0 || pos>pl->cursize || IsFull (pl))
	{
		return -1;
	}
	for(int i=pl->cursize -1;i>=pos;i--)
	{
		pl->elem [i+1]=pl->elem [i];
	}
	pl->elem [pos]=val;
	pl->cursize ++;//一定別忘了插入後長度+1
	return 1;
}

按位刪除:

//按位刪除
int DeletePos(PSeqList pl,int pos)
{
	if(pl == NULL)
	{
		return 0;
	}
	if(pos<0 || pos>pl->cursize -1)
	{
		return -1;
	}
	for(int i=pos;i<pl->cursize -1;i++)
	{
		pl->elem [i]=pl->elem [i+1];
	}
	pl->cursize --;
	return 1;
}

按元素刪除:

//按元素刪除
int DeleteKey(PSeqList pl,ELEM_TYPE key)
{
	if(pl==NULL)
	{
		return 0;
	}
	int i=0;
	//遍歷陣列,看key是否存在
	for(i;pl->elem [i]!=key;i++)
	{
		if(i==pl->cursize -1)
		{
			return -1;
		}
	}

	for(int j=i;j<pl->cursize ;j++)
	{
		//若找到
		if(pl->elem [j]==key)
		{
			//刪除
			for(int k=j;k<pl->cursize -1;k++)
			{
				pl->elem [k]=pl->elem [k+1];
			}
			pl->cursize --;
			j--;
		}
	}
	return 1;
}

其他功能:

//查詢元素
int Search(PSeqList pl,ELEM_TYPE key)
{
	int find=-1;
	if(pl !=NULL)
	{
		for(int i=0;i<pl->cursize ;i++)
		{
			if(pl->elem [i]==key)
			{
				find=i;
				break;
			}
		}
	}
	return find;
}
//判滿
bool  IsFull(PSeqList pl)
{
	if(pl->cursize ==ARRAY_SIZE )
	{
		return 1;
	}
	return 0;
}

//顯示函式
void Show(PSeqList pl)
{
	for(int i=0;i<pl->cursize;i++)
	{
		printf("%d  ",pl->elem [i]);
	}
}

//清空資料
void Clear(PSeqList pl)
{
	pl->cursize =0;
}

//銷燬順序表
void Destroy(PSeqList pl)
{
	Clear (pl);
}

完整程式碼如下:

SeqList.h

#include<stdio.h>
#define ARRAY_SIZE 5

typedef int ELEM_TYPE;//方便於修改元素的型別,不僅限於int型
//定義結構體
typedef struct SeqList
{
	ELEM_TYPE  elem[ARRAY_SIZE ];//定義陣列
	int cursize;//陣列長度
}SeqList ,*PSeqList;

//初始化
void InitList(PSeqList pl);
//按位插入
int InsertPos(PSeqList pl,int pos,ELEM_TYPE val);
//按位刪除
int DeletePos(PSeqList pl,int pos);
//按元素刪除
int DeleteKey(PSeqList pl,ELEM_TYPE key);
//查詢元素
int Search(PSeqList pl,ELEM_TYPE key);
//判滿
bool  IsFull(PSeqList pl);
//顯示函式
void Show(PSeqList pl);
//清空資料
void Clear(PSeqList pl);
//銷燬順序表
void Destroy(PSeqList pl);

SeqList.cpp

#include<stdio.h>
#include  "SeqList.h"
#include<assert.h>


//初始化
void InitList(PSeqList pl)
{
	assert(pl != NULL);
	if(pl == NULL)
	{
		return ;
	}
	pl ->cursize =0;//將初始長度置為0
}

//按位插入
int InsertPos(PSeqList pl,int pos,ELEM_TYPE val)
{
	if(pl == NULL)
	{
		return 0;
	}
	if(pos<0 || pos>pl->cursize || IsFull (pl))
	{
		return -1;
	}
	for(int i=pl->cursize -1;i>=pos;i--)
	{
		pl->elem [i+1]=pl->elem [i];
	}
	pl->elem [pos]=val;
	pl->cursize ++;//一定別忘了插入後長度+1
	return 1;
}

//按位刪除
int DeletePos(PSeqList pl,int pos)
{
	if(pl == NULL)
	{
		return 0;
	}
	if(pos<0 || pos>pl->cursize -1)
	{
		return -1;
	}
	for(int i=pos;i<pl->cursize -1;i++)
	{
		pl->elem [i]=pl->elem [i+1];
	}
	pl->cursize --;
	return 1;
}

//按元素刪除
int DeleteKey(PSeqList pl,ELEM_TYPE key)
{
	if(pl==NULL)
	{
		return 0;
	}
	int i=0;
	//遍歷陣列,看key是否存在
	for(i;pl->elem [i]!=key;i++)
	{
		if(i==pl->cursize -1)
		{
			return -1;
		}
	}

	for(int j=i;j<pl->cursize ;j++)
	{
		//若找到
		if(pl->elem [j]==key)
		{
			//刪除
			for(int k=j;k<pl->cursize -1;k++)
			{
				pl->elem [k]=pl->elem [k+1];
			}
			pl->cursize --;
			j--;
		}
	}
	return 1;
}

//查詢元素
int Search(PSeqList pl,ELEM_TYPE key)
{
	int find=-1;
	if(pl !=NULL)
	{
		for(int i=0;i<pl->cursize ;i++)
		{
			if(pl->elem [i]==key)
			{
				find=i;
				break;
			}
		}
	}
	return find;
}
//判滿
bool  IsFull(PSeqList pl)
{
	if(pl->cursize ==ARRAY_SIZE )
	{
		return 1;
	}
	return 0;
}

//顯示函式
void Show(PSeqList pl)
{
	for(int i=0;i<pl->cursize;i++)
	{
		printf("%d  ",pl->elem [i]);
	}
}

//清空資料
void Clear(PSeqList pl)
{
	pl->cursize =0;
}

//銷燬順序表
void Destroy(PSeqList pl)
{
	Clear (pl);
}

main.cpp

#include<stdio.h>
#include  "SeqList.h"

int main()
{
	SeqList a;
	InitList (&a);//初始化
	for(int  i=0;i<10;i++)
	{
		InsertPos (&a,i,i+1);
	}
	 DeleteKey(&a,3);
	 Show(&a);
}