函數介紹
- InsList---->在索引為i的位置插入元素e
- delete---->删除索引為i的元素
- GetData---->傳回指定索引的元素
- Locate---->傳回指定元素的索引
- Merge---->傳回一個SeqList,通過兩個升序SeqList合并而來
詳細代碼
#include <stdio.h>
#include <stdlib.h>
//宏定義常量
#define maxsize 20
typedef struct SeqList{
int elem[maxsize]; /* 線性表占用的數組空間*/
int last; /*最後一個元素在數組中的位置(下标值),空表置為-1*/
} SeqList;
//插入元素,在索引為i的位置插入元素e
int InsList(SeqList *L, int i, int e){
int k;
//首先判斷插入位置是否合法
if((i<0) || (i>=L->last+2)){
printf("插入位置i值不合法");
return 0;
}
if(L->last>=maxsize-1){
printf("表已滿無法插入");
return 0;
}
//為插入元素而移動位置
//從最後開始移動,一個個元素一點點往後搬家
//1 2 3 4 5---->1 2 7 3 4 5
for(k=L->last;k>=i;k--){
L->elem[k+1]=L->elem[k];
}
//添加元素
L->elem[i]=e;
//修改長度
L->last++;
return 1;
}
//删除索引下的元素
int delete(SeqList *L,int index) {
if((index<0)||(index>L->last)){
printf("删除位置不合法!");
return 0;
}
int pop=L->elem[index];
//将後面的元素依次前移
for(int i=index;i<=L->last;i++){
L->elem[i-1]= L->elem[i];
}
L->last--;
}
//按索引查找
int GetData(SeqList *L,int i) {
return L->elem[i];
}
//按内容查找第一次出現的索引,找不到傳回-1
int Locate(SeqList *L,int e) {
for (int i=0;i<L->last;i++) {
if(L->elem[i]==e) {
return i;
}
}
return -1;
}
//合并
SeqList Merge(SeqList *LA, SeqList *LB) {
SeqList LC;
int i=0,j=0,k=0;
while(i<=LA->last&&j<=LB->last) {
if(LA->elem[i]<=LB->elem[j]){
LC.elem[k]= LA->elem[i]; i++;
}else{
LC.elem[k]=LB->elem[j]; j++;
}
k++;
}
//當表LA長則将表LA餘下的元素賦給表LC
while(i<=LA->last){
LC.elem[k]= LA->elem[i]; i++; k++;
}
//當表LB長則将表LB餘下的元素賦給表LC
while(j<=LB->last){
LC.elem[k]= LB->elem[j]; j++; k++;
}
LC.last=k-1;
return LC;
}
//輸出順序表
void printSeqList(SeqList *L) {
for (int i=0;i<=L->last;i++) {
printf("%d ",L->elem[i]);
}
}
int main(void) {
SeqList L;
L.last=-1;
InsList(&L,0,1);
InsList(&L,1,1);
printSeqList(&L);
return 0;
}