「數據結構」順序表操作方法
以下是順序表的基本操作,以待日後查閱。
頭文件的引入和一些聲明
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
順序表的初始化操作
Status InitList_Sq(SqList &L){
// 構造空表
// 分配預定義大小的存儲空間
L.elem = (ElemType * ) malloc (LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);// 如果空間分配失敗
L.length=0;// 置當前順序表的長度爲0
L.listsize=LIST_INIT_SIZE;// 置當前分配的存儲空間容量爲LIST_INIT_SIZE的值
return OK;
}
順序表的創建操作
Status CreateList_Sq(SqList &L){
// 建立有元素的表
printf("Number of data:\n");
scanf("%d",&L.length);
printf("Input the data:\n");
for(int i=0;i<L.length;i++){
scanf("%d",&L.elem[i]);
}
return OK;
}
順序表的插入操作(一)
Status ListInsert(SqList &L, Elemtype e){
// 在順序表的L的第i個元素之前插入新的元素e,其中1<=i<=L.length+1
// 這裏的數據元素的訪問方式是通過指針來間接訪問
ElemType *newbase, *p, *q;
if(i<1 || i>L.length+1)// 如果插入位置不合法
return ERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(Elemtype));
if(!newbase)// 空間分配失敗
exit(OVERFLOW);
L.elem=newbase;// 修改增加空間之後的基址
L.listsize+=LISTINCREMENT;// 修改增加空間之後的存儲空間容量
}
q=&(L.elem[i-1]);// q指示插入位置
for(p=&(L.elem[L.length-1]);p>=q;--p)// p始終指示待移動的位置,此處爲從最後開始每個向後移
*(p+1)=*p;
*q=e;// e插入騰出的空
++L.length;// 表長加一
return OK;
}
順序表的插入操作(二)
Status ListInsert_Sq(SqList &L, Elemtype e){
// 在順序表的L的第i個元素之前插入新的元素e,其中1<=i<=L.length+1
// 這裏的數據元素的訪問方式是通過數組來直接訪問
ElemType *newbase, *p, *q;
if(i<1 || i>L.length+1)// 如果插入位置不合法
return ERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)// 空間分配失敗
exit(OVERFLOW);
L.elem=newbase;// 修改增加空間之後的基址
L.listsize+=LISTINCREMENT;// 修改增加空間之後的存儲空間容量
}
for(int j=L.length-1;j>=i-1;j--)// 將插入位置之後的所有元素後移一位
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;// e插入騰出的空
L.length++;// 表長加一
return OK;
}
順序表的刪除操作
Status ListDelete_Sq(SqList &L){
// 刪除順序表L中的第i個元素,並用e返回其值,其中1<=i<=L.length
ElemType *p, *q;
if((i<1)||(i>L.length-1))// 如果位置不合法
return ERROR;
p=&(L.elem[i-1]);// p始終指示被刪除元素的位置
e=*p;// 用e保存被刪除元素
q=L.elem+L.length-1;// q指示表爲元素的位置
for(++p;p<=q;++p)//
*(p-1)=*p;// 刪除元素之後,所有後面的元素前移
--L.length;// 表長減一
return OK;
}
順序表的查找操作
Status LocateElem_Sq(SqList &L, ElemType e){
// 查找線性表L中值爲e的數據元素,並返回其在表中首次出現時的位序號;若表中沒有,則返回0
int i;
for(i=1;i<L.length&&L.elem[i-1]!=e;i++);
if(i<=L.length)
return i;
else
return 0;
}
順序表的輸出操作
Status Print_Sq(SqList &L){
// 輸出表L中各數據元素值
for(int i=0;i<L.length;i++){
printf("%d ",L.elem[i]);
}
printf("\n");
}
主函數
int main(){
SqList L;
// 加入相應的模塊
}
一些其他算法
就地逆置
Status Inverse_Sq(SqList &L){
// 順序表的就地逆置
int temp;
for(int i=0;i<L.length/2;i++){
temp=L.elem[i];
L.elem[i]=L.elem[L.length-i-1];
L.elem[L.length-i-1]=temp;
}
}