南郵資料結構實驗1.1:順序表的相關操作

Wonz發表於2018-05-25

題目:參照程式2.1~2.7,編寫程式碼,完成順序表的初始化、查詢、插入、刪除、輸出、撤銷等操作。

部分程式碼:

順序表的結構體定義:

typedef struct {
	int n;               //順序表的長度
	int maxLength;       //順序表的最大長度
	ElemType *element;   //存放動態分配一維陣列首地址
}SeqList;

插入函式程式碼:

//初始化插入
Status Insert(SeqList *L, int i, ElemType x) {
	int j;
	if (i<-1 || i>L->n - 1)                  //判斷下標i是否越界
		return ERROR;
	if (L->n == L->maxLength)                //判斷順序表儲存空間是否已滿
		return ERROR;
	for (j = L->n - 1; j > i; j--) {
		L->element[j + 1] = L->element[j];   //從後往前逐個後移元素
	}
	L->element[i + 1] = x;                   //將新元素放入下標為i+1的位置
	L -> n = L->n + 1;                       //長度+1
	return OK;
}

刪除函式程式碼:

//順序表的刪除
Status Delete(SeqList *L, int i){
    int j;
    if(i<0||i>L->n-1){                   //下標i是否越界
        return ERROR;
    }
    if(!L->n){                           //順序表是否為空
        return ERROR;
    }
    for(j=i+1;j<L->n;j++){
        L->element[j-1]=L->element[j];   //從前往後逐個前移元素
    }
    L->n--;                              //表長減1
    return OK;
}

完整程式碼:

#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;

typedef struct {
	int n;               //順序表的長度
	int maxLength;       //順序表的最大長度
	ElemType *element;   //存放動態分配一維陣列首地址
}SeqList;


//順序表初始化
Status Init(SeqList *L, int mSize) {
	L->maxLength = mSize;
	L->n = 0;
	L->element = (ElemType*)malloc(sizeof(ElemType)*mSize);
    if(!L->element)
    return OK;
}


//順序表的查詢
Status Find(SeqList L,int i,ElemType *x){
    if(i<0||i>L.n-1){
        return ERROR;    //判斷元素下標i是否越界
    }
    *x=L.element[i];     //取出element[i]的值通過引數x返回
    return OK;
}


//初始化插入
Status Insert(SeqList *L, int i, ElemType x) {
	int j;
	if (i<-1 || i>L->n - 1)                      //判斷下標i是否越界
		return ERROR;
	if (L->n == L->maxLength)                    //判斷順序表儲存空間是否已滿
		return ERROR;
	for (j = L->n - 1; j > i; j--) {
		L->element[j + 1] = L->element[j];   //從後往前逐個後移元素
	}
	L->element[i + 1] = x;                       //將新元素放入下標為i+1的位置
	L -> n = L->n + 1;                           //長度+1
	return OK;
}


//順序表的刪除
Status Delete(SeqList *L, int i){
    int j;
    if(i<0||i>L->n-1){                   //下標i是否越界
        return ERROR;
    }
    if(!L->n){                           //順序表是否為空
        return ERROR;
    }
    for(j=i+1;j<L->n;j++){
        L->element[j-1]=L->element[j];   //從前往後逐個前移元素
    }
    L->n--;                              //表長減1
    return OK;
}


//順序表輸出
int Output(SeqList L) {
	int i;
	if (!L.n)
		return ERROR;                 //判斷順序表是否為空
	for (i = 0; i <= L.n - 1; i++)
		printf("%d ", L.element[i]);  //從前往後逐個輸出元素
	return OK;
}


//順序表的撤銷
void Destroy(SeqList *L){
    (*L).n=0;
    (*L).maxLength=0;
    free((*L).element);
}



void main()
{
	int i,x;
	SeqList list;
	Init(&list, 10);                   //對線性表初始化
	for (i = 0; i < 9; i++) {
		Insert(&list, i - 1, i);   //將0-8插入到順序表中
	}
	Output(list);
    printf("\n");
    Delete(&list,0);                       //刪除0
	Output(list);
	Find(list,2,&x);                   //查詢下標為2的元素並輸出
    printf("\nthe value is:");
	printf("%d",x);
    Destroy(&list);
}

實驗結果:

版權宣告:本文為博主原創文章,未經博主允許不得轉載。

相關文章