1. 程式人生 > 實用技巧 >順序表的基本運用實現整理

順序表的基本運用實現整理

寫在前面:資料結構與演算法篇,分享技術,共同進步,有不足請見諒,相關意見可評論告知 ~

贛江凌凌求學中,
廬陵飄飄子然兮;
演算法悠悠與結構,
熱愛漫漫可相抵;

目錄

標頭檔案及其相關操作

標頭檔案、巨集定義、結構體、布林定義

# 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);
}

輸出結果