數據結構筆記之—— 順序表實現

學習數據結構了,寫下來,加深記憶。

第一篇:


//system("cls");  控制檯屏幕刷新
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define MAXSIZE 100
typedef int DataType;

typedef struct
{
	DataType data[MAXSIZE];
	int length;
}SeqList;
///初始化順序表
SeqList SeqListInit( )/// OK
{
	SeqList L;
	//cout<<"線性表以創建"<<endl;
	L.length = 0;
	return L;
}
/// 銷燬順序表
SeqList ListClear(SeqList L)/// OK
{
	L.length=0;
	//cout<<"線性表已銷燬"<<endl;
	return L;
}
///判斷順序表是否爲空表
int ListEmpty(SeqList L)/// OK
{
	return (L.length==0);
}
///判斷順序表是否爲滿
int ListFull(SeqList L)/// OK
{
	return (L.length==MAXSIZE);
}

///求順序表長度
int ListLength(SeqList L)/// OK
{
	return L.length;
}


///從順序表中查找元素
bool ListGet(SeqList L ,int i,DataType &x)/// OK
{
	if(i<0||i>L.length)
    {
        printf("查詢錯誤!\n");
        return false;//  超出表範圍,錯誤,返回-1
    }
	x = L.data[i-1];//順序表元素下標從0開始
	return true;
}

///從順序表中查找與給定元素值相同的元素在順序表中的位置
int ListLocate(SeqList L, DataType x)/// OK
{
	int i,mun = -1;
	for(i = 0;i<L.length;i++)
	{
		if(L.data[i]==x)
		{
			mun = i;
		}
	}
	if(mun==-1)
    {
        printf("當前順序表沒有元素 %d \n",x);
        return -1;
    }
    else
        return mun+1;
}
/// 向順序表中插入元素
SeqList  ListInsert1(SeqList L,DataType x)/// OK
{
    if(L.length==MAXSIZE)
        printf("表滿,錯誤\n");//  表滿,返回錯誤
    L.length++;
    L.data[L.length-1] = x;
    return L;

}
///  插入元素 給定元素位置和值
SeqList  ListInsert(SeqList L,int i,DataType x)
{
    int j;
    i = i-1;
	if(L.length>MAXSIZE)
    {
        printf("表滿,錯誤\n");//  表滿,返回錯誤
        return L;
    }
	for(j = L.length-1;j>i;j--)
	{
		L.data[j] = L.data[j-1];
	}
	L.length++;
	L.data[i] = x;
	return L;
}

/// 從順序表中刪除元素
bool ListDelete(SeqList &L,int i) ///i 認爲是邏輯結構的位置,即從1開始
{
	int j;
	if(i<1||i>L.length)
    {
		///printf("刪除遇到錯誤\n");//  表空,返回錯誤
        return false;
    }
	for(j = i;j<L.length;j++)
		L.data[j-1] = L.data[j];
	L.length--;
	return true;
}

/*求順序表中元素的前驅*/
bool ListPrior (SeqList L,DataType e)  ///OK
{
	DataType i,k = -1;
	if(L.data[0] == e)
    {
        printf("順序表第一個元素沒有前驅\n");
        return false;//  順序表第一個元素沒有前驅
    }
	for(i = 1;i<L.length;i++)
		if(e == L.data[i])
			k = i-1;
	if(k==-1)
    {
        printf("順序表中沒有元素 %d \n",e);
        return false;
    }
    else
         printf("元素 %d  的前驅爲 %d \n",e,L.data[k]);
    return true;
}
/*求順序表中元素的後繼*/
bool ListNext(SeqList L,DataType e)///OK
{
	int i,k = -1;
	if(L.data[L.length-1] == e)
    {
        printf("順序表最後一個元素沒有後繼 \n");//  順序表最後一個元素沒有後繼
        return false;
    }
	for(i = 0;i<L.length-1;i++)
		if(e == L.data[i])
			k = i+1;
	if(k==-1)
    {
        printf("順序表中沒有元素 %d \n",e);
        return false;
    }
    else
        printf("元素 %d  的後繼爲 %d \n",e,L.data[k]);
    return true;
}

//輸出順序表(遍歷順序表 )
void Prinlist(SeqList L)/// OK
{
	int i;
	for(i = 0;i<L.length;i++)
		printf("%d ",L.data[i]);
	printf("\n");
}
void mainScreen()
{
    printf("請輸入序號以使用以下功能 \n");
    printf("0. 退出程序\n");///   OK
    printf("1. 建立順序表\n");///   OK
    printf("2. 插入元素,輸入元素 x \n");///   OK
    printf("3. 插入元素,輸入元素 x , 插入位置 i \n");
    printf("4. 刪除位置爲 i 的元素\n");///   OK
    printf("5. 判斷順序表是否爲空 \n");///   OK
    printf("6. 判斷順序表是否爲滿 \n");///   OK
    printf("7. 查詢順序表長度 \n");///   OK
    printf("8. 遍歷順序表 \n");///   OK
    printf("9.  查詢元素 x 位置 ,輸入 x\n");///   OK
    printf("10. 查詢位置爲 i 元素,輸入 i \n");///  OK
    printf("11.  查詢元素 x 的前驅,輸入 x \n");/// 返回值無顯示
    printf("12. 查詢元素 x 的後繼,輸入 x \n");/// 返回值無顯示
    printf("13. 銷燬順序表\n");
    printf("__________________________________________\n");

}
int main()
{

	int n,x,i;
	mainScreen();
	SeqList L;
	while(scanf("%d",&n)&&n!=0)
    {
        switch(n)
        {
            case 1: system("cls");
                    L = SeqListInit();
                    printf("順序表已經建立!!\n");
                    //printf("輸入 任意數字 返回主菜單\n");
                    //scanf("%d",&temp);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 2: system("cls");
                    printf("插入元素,請輸入元素 x ");
                    scanf("%d",&x);
                    L = ListInsert1(L,x);
                    printf("元素 %d 已插入 \n",x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 3: system("cls");
                    printf("插入元素,請輸入元素 x 及序號 i ");///開始時一直錯誤原因:調用插入函數時 x 和 i 位置反了ListInsert(L,x,i);
                    scanf("%d%d",&x,&i);
                    L = ListInsert(L,i,x);
                    printf("元素 %d 已插入 \n",x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 4: system("cls");
                    printf("刪除位置爲 i 的元素,請輸入 i ");
                    scanf("%d",&i);
                    if(!ListDelete(L,i))
                        printf("刪除遇到錯誤!\n");
                    else
                        printf("%d 位置已刪除 \n",i);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 5: system("cls");// empty
                    if(ListEmpty(L))
                        printf("順序表爲空!!\n");
                    else
                        printf("順序表不爲空!!\n");
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 6: system("cls");//  full
                    if(ListFull(L))
                        printf("順序表爲滿!!\n");
                    else
                        printf("順序表不爲滿!!\n");
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 7: system("cls");
                    x = ListLength(L);
                    printf("順序表長度爲 %d \n",x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 8: system("cls");
                    printf("遍歷順序表\n");
                    Prinlist(L);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 9 :system("cls");
                    printf("查詢元素 x 位置 ,輸入 x ");
                    scanf("%d",&x);
                    i = ListLocate(L,x);
                    if(i!=-1)
                        printf("元素 %d 位置爲 %d \n",x,i );
                    else
                        printf("查找失敗!\n");
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 10:system("cls");
                    printf("查詢位置爲 i 元素,輸入 i ");
                    scanf("%d",&i);
                    if(ListGet(L,i,x))
                        printf("位於位置 %d 的元素爲爲 %d \n",i,x);

                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 11: system("cls");
                    printf("查詢元素 x 的前驅, 請輸入 x ");
                    scanf("%d",&x);
                    ListPrior(L,x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 12:system("cls");
                    printf("查詢元素 x 的後繼, 請輸入 x ");
                    scanf("%d",&x);
                    ListNext(L,x);
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            case 13:system("cls");
                    printf("銷燬順序表 ");
                    L = ListClear(L);
                    printf("順序表已銷燬 ");
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
            default:printf("error");
                    getchar();
                    getchar();
                    system("cls");
                    mainScreen();
                    break;
        }
    }
	return 0;
}


發佈了48 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章