【資料結構】定長順序表
阿新 • • 發佈:2018-12-12
【資料結構】順序表
關於基礎資料結構,分為兩類:
①線性:陣列、連結串列、順序表
②非線性:樹、圖
順序表和連結串列的區別:
順序表:邏輯連續、物理連續
連結串列:邏輯連續、物理不一定連續
順序表可細分為兩類:
①定長順序表(在棧內操作)
②不定長順序表(可擴容,在堆內操作)
↑因此順序表一般都通過建立陣列來建立。
此篇部落格專門針對定長順序表做一些操作!!
初始化:
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);
}