1.線性表的順序存儲又稱爲順序表
2.順序表必須佔用一整塊事先分配大小的固定的存儲空間(一組地址連續的存儲單元),依次存儲線性表中的數據元素,從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰,所以進行插入或刪除操作時,平均需要移動半個表的元素,這是相當費時的操作,不便於存儲空間的管理。
下面我們來具體介紹順訓表具體運算的實現:
#include<stdio.h>
#include<malloc.h>
#define MaxSize 20//爲順序表分配具體的存儲空間
typedef char Elemtype;
typedef struct
{
Elemtype data[MaxSize];
int length;
}sqlist;
//下面我們先來聲明要用到的一些基本函數以及這些函數在Main()函數內的調用
//函數的聲明
void InitList(sqlist *&L);
void CreateList(sqlist *&L,Elemtype a[],int n);
bool ListInsert(sqlist *&L,int i,Elemtype e);
void DispList(sqlist *L);
bool ListEmpty(sqlist *L);
int ListLength(sqlist *L);
bool GetElem(sqlist *L,int i,Elemtype &e);
int LocateElem(sqlist *L,Elemtype e);
bool ListDelete(sqlist *&L,int i,Elemtype &e);
void DestroyList(sqlist *&L);
bool ListDeletes_t(sqlist *&L,ElemType s,Elemtype t);
//基本函數在主函數中的調用
int main()
{
sqlist *L;
ElemType e;
ElemType a[5]={'a','b','c','d','e'};
//初始化順序表
InitList(L);
//建立數據表
CreateList(L,a,5);
//輸出順序表
DispList(L);
//輸出順序表的長度
printf("%d\n",ListLength(L));
//判斷該順序表是否爲空
if(ListEmpty(L)==false) printf("該順序表不爲空\n");
else printf("該順序表爲空\n");
//對某個元素進行輸出
if(GetElem(L,3,e)==1) printf("%c\n",e);
else printf("該元素不存在\n");
printf("%d\n",LocateElem(L,'a'));
//插入數據
ListInsert(L,4,'f'); DispList(L);
ListInsert(L,4,'g'); DispList(L);
ListDelete(L,3,e); DispList(L);
ListDeletes_t(L,'d','f');
DispList(L);
printf("%d\n",ListLength(L));
DestroyList(L);
return 0;
}
//初始化順序表
void InitList(sqlist *&L)
{
L=(sqlist *)malloc(sizeof(sqlist));
L->length=0;
}
//建立順序表
void CreateList(sqlist *&L,Elemtype a[],int n)
{
int i;
L=(sqlist *)malloc(sizeof(sqlist));
for(i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
//插入數據元素
bool ListInsert(sqlist *&L,int i,Elemtype e)
{
int j;
//對i進行判斷,即對要插入的元素進行判斷是否在該順序表規定的範圍內
if(i<1||i>L->length+1)
return false;
if(L->length>=MaxSize)
{
printf("線性表溢出!");
return false;
}
for(j=L->length;j>=i;j--)
L->data[j]=L->data[j-1];
L->data[i-1]=e;
L->length++;
return true;
}
//刪除L中的某個元素
bool listDelete(sqlist *&L,int i,Elemtype &e)
{
int j;
if(L->length==0)
{
printf("線性表L爲空!\n");
return false;
}
else if(i<1||i>L->length)
{
printf("要刪除的數據元素不存在!\n");
return false;
}
else
{
e=L->data[i-1];
for(j=i;j<L->length;j++)
L->data[j-1]=L->data[j];
L->length--;
return true;
}
}
//判斷順序表是否爲空
bool EmptyList(sqlist *L)
{
return (L->length==0);
}
//輸出順序表的長度
int ListLength(sqlist *L)
{
return (L->length);
}
//輸出順序表
void DispList(sqlist *L)
{
int i;
for(i=0;i<L->length;i++)
printf("%c",L->data[i]);
printf("\n");
}
//輸出順序表中的某個元素值
bool GetElem(sqlist *&L,int i,Elemtype &e)
{
if(i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
//輸出某個元素值所在順序表中的位置
int LocataElem(sqlist *L,ELemtype e)
{
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
//刪除元素值介於s和t之間的元素
bool ListDeletes_t(sqlist *&L,Elemtype s,Elemtype t)
{
if(s>=t||L->length==0)
return false;
int k=0;
for(int i=0;i<L->length;i++)
if(L->data[i]<s||L->data[i]>t)
{
L->data[k]=L->data[i];
k++;
}
L->length=k;
return true;
}