順序表的基本運用實現整理
阿新 • • 發佈:2020-11-05
寫在前面:資料結構與演算法篇
,分享技術,共同進步,有不足請見諒,相關意見可評論告知 ~
目錄贛江凌凌求學中,
廬陵飄飄子然兮;
演算法悠悠與結構,
熱愛漫漫可相抵;
標頭檔案及其相關操作
標頭檔案、巨集定義、結構體、布林定義
# include <stdio.h> # include <stdlib.h> # include <cstdlib> #define MAXSIZE 20 //初始最大值 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OVERFLOW -1 typedef int ElemType; typedef struct { ElemType *elem ; ElemType data[MAXSIZE]; int length; //當前長度 int listsize ; //當前分配的容量 }SqList; // 布林的定義 typedef enum Bool { FALSE,TRUE }Bool;
函式宣告
// 函式宣告 Bool CreatList(SqList* L) ; Bool InitList(SqList* L) ; Bool GetElem(SqList L, int i, ElemType* e) ; void display(SqList L); int ListLength(SqList L) ; Bool ListDelete(SqList *L,int i,ElemType* e) ; int LocateElem(SqList L,ElemType e) ; Bool UnionList(SqList* L1,SqList* L2,SqList* L) ; void Merge() ; void MergeList_Sq(SqList La,SqList Lb,SqList &Lc) ;
函式功能
順序建立順序表
Bool CreatList(SqList* L)
{
int i;
printf("請輸入建立表的長度(0-20)?\n");
scanf("%d",&(L->length));
if(L->length<0||L->length>MAXSIZE)
return FALSE;
for(i=1;i<=L->length;i++)
{
L->data[i-1]=i;
}
return TRUE;
}
初始化順序表
Bool InitList(SqList* L){ L->elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType)) ; if(! L->elem) exit(OVERFLOW); L->length = 0 ; L->listsize = LIST_INIT_SIZE ; return TRUE ; }
顯示順序表
void display(SqList L)
{
int i;
for(i=0;i<L.length;i++)
printf("%d ",L.data[i]);
printf("\n");
}
顯示錶長
int ListLength(SqList L)
{
return L.length;
}
按位查詢 按位獲取元素
Bool GetElem(SqList L, int i, ElemType* e)
{
if(L.length==0 || i<1|| i>L.length)
return FALSE;
*e=L.data[i-1];
return TRUE ;
}
按位插入
{
int k;
if(L->length==MAXSIZE || i<1|| i>L->length+1)
return FALSE;
if(i<=L->length)
{
for(k=L->length-1;k>=i-1;k--)
L->data[k+1]=L->data[k];// 倒序
}
L->data[i-1]=e;
L->length++;
return TRUE;
}
按位刪除
Bool ListDelete(SqList *L,int i,ElemType* e){
int j ;
if(L->length > MAXSIZE || i<1 || L->length==0)
return FALSE;
*e=L->data[i-1] ;
if(i<L->length){
for(j=i-1 ; j<L->length-1 ;j++)
L->data[j] = L->data[j+1] ;
}
L->length -- ;
return TRUE ;
}
按值查詢
int LocateElem(SqList L,ElemType e)
{
int i=0;
for(i=0;i<L.length;i++)
if(L.data[i]==e)
return i+1;
return 0;
}
並集
Bool UnionList(SqList* L1,SqList* L2,SqList* L)
{
int i,j;
L->length=0;
for(i=0;i<L1->length;i++)
{
L->data[i]=L1->data[i];
}
for(j=0;j<L2->length;j++)
if(LocateElem(*L1,L2->data[j])==0)
{
if(i>=MAXSIZE)
return FALSE;
L->data[i]=L2->data[j];
i++;
}
L->length=i;
return TRUE;
}
主函式
int main(){
ElemType e;
int i,j,line,num,num1,num2,num3,num4,num5;
SqList List;
ElemType elem;
SqList L1,L2,L3,L4;
Bool flag ;
//預設按順序自動建立順序表
printf("1、順序自動建立建立順序表\n") ;
if(!CreatList(&List))
printf("順序表建立失敗!\n");
else
printf("順序表建立成功!\n");
printf("建立的順序表為\n") ;
display(List);
printf("\n\n");
printf("2、自定義建立建立順序表\n") ;
//自定義建立順序表
InitList(&L1);
InitList(&L2);
printf("請輸入L1初始長度和初始值");
scanf("%d",&line);
for(i=1;i<=line;i++){
scanf("%d",&e);
ListInsert(&L1,i,e);
}
printf("請輸入L2初始長度和初始值");
scanf("%d",&line);
for(j=1;j<=line;j++){
scanf("%d",&e);
ListInsert(&L2,j,e);
}
printf("順序表L1為\n") ;
display(L1) ;
printf("順序表 L2為\n") ;
display(L2) ;
printf("\n\n");
printf("以下操作物件為順序表L1\n") ;
printf("3、順序表的按位查詢並獲取\n") ;
printf("請輸入要查詢的位序\n") ;
scanf("%d",&num);
printf("\n\n") ;
GetElem(L1,num,&elem);
printf("順序表L1的第%d個元素是%d",num,elem);
printf("\n\n");
printf("4、順序表的按元素獲取位置\n") ;
printf("請輸入要查詢的元素\n") ;
scanf("%d",&num4);
num5 = LocateElem(L1,num4) ;
printf("%d是順序表的第%d個元素",num4,num5);
printf("\n\n");
printf("5、順序表的按位插入\n") ;
printf("請輸入要查入的位序\n") ;
scanf("%d",&num1);
printf("請輸入要查入的元素\n") ;
scanf("%d",&num2);
printf("在位序為%d的地方插入%d\n",num1,num2) ;
ListInsert(&L1,num1,num2);
printf("插入後的連結串列如下") ;
display(L1);
printf("\n\n");
printf("6、順序表的按位刪除\n") ;
printf("請輸入要刪除元素的位序\n") ;
scanf("%d",&num3);
ListDelete(&L1,num3,&elem) ;
printf("刪除第%d個元素是%d\n",num3,elem);
printf("刪除後該表的長度為;%d\n",ListLength(L1)) ;
printf("刪除後的連結串列如下") ;
display(L1) ;
printf("\n\n");
printf("7、順序表的並集\n") ;
flag=UnionList(&L1,&L2,&L3);
if(!flag)
printf("合併後,順序表的長度超過最大範圍");
printf("該表的長度為:%d\n",ListLength(L3));
display(L3);
}
輸出結果
合併演算法
核心演算法
void MergeList_Sq(SqList La,SqList Lb,SqList &Lc){
int *pa,*pb,*pc,*pa_last,*pb_last;
pa = La.elem; pb = Lb.elem;
Lc.listsize = Lc.length = La.length+Lb.length;
pc = Lc.elem =(ElemType*)malloc(Lc.listsize*sizeof(ElemType));
if(!Lc.elem) exit(OVERFLOW); //儲存分配失敗
pa_last = La.elem +La.length - 1;
pb_last = Lb.elem +Lb.length - 1;
while(pa<=pa_last && pb<=pb_last){//歸併
if(*pa<=*pb) *pc++=*pa++;
else *pc++=*pb++;
}
while(pa<=pa_last) *pc++=*pa++;//插入La的剩餘元素
while(pb<=pb_last) *pc++=*pb++;//插入Lb的剩餘元素
}
void merge(){
//將所有線上性表Lb中但不在La中的資料元素插入到La中
ElemType e;
int i,j,line;
//La和Lb建立和賦值
SqList La,Lb;
InitList_Sq(La);
InitList_Sq(Lb);
printf("請輸入La初始長度和初始值:");
scanf("%d",&line);
for(i=1;i<=line;i++){
scanf("%d",&e);
ListInsert_Sq(La,i,e);
}
printf("請輸入Lb初始長度和初始值:");
scanf("%d",&line);
for(j=1;j<=line;j++){
scanf("%d",&e);
ListInsert_Sq(Lb,j,e);
}
ListPrint(La);
ListPrint(Lb);
for(i=0;i<Lb.length;i++){
bool repate = false;//repate用來判斷元素是否重複
for(j=0;j<La.length;j++){
if(Lb.elem[i]==La.elem[j]){
repate = true;
}
}
if(!repate){//if不重複,插入到La表尾
ListInsert_Sq(La,La.length+1.,e = Lb.elem[i]);
}
}
ListPrint(La);
}
void merges(){
ElemType e;
int i,j,line;
//La和Lb建立及賦值
SqList La,Lb,Lc;
InitList_Sq(La);
InitList_Sq(Lb);
printf("請輸入La初始長度和初始值:");
scanf("%d",&line);
for(i=1;i<=line;i++){
scanf("%d",&e);
ListInsert_Sq(La,i,e);
}
printf("請輸入Lb初始長度和初始值:");
scanf("%d",&line);
for(j=1;j<=line;j++){
scanf("%d",&e);
ListInsert_Sq(Lb,j,e);
}
ListPrint(La);
ListPrint(Lb);
MergeList_Sq(La,Lb,Lc);
ListPrint(Lc);
}