順序表的基本運算的實現?

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章