1. 程式人生 > >資料結構:線性表之順序表

資料結構:線性表之順序表


順序表之缺點: 每當插入一個元素,可能會有相當多個元素挨著盤兒的往後挪.

                          每當刪除一個元素,可能會有相當多個元素挨著盤兒地往前挪.

                          這浪費了大量的時間,一旦資料過大,這挪的時間就相當久了,而連結串列在插入和刪除的時候,就可以不用挪,不會消耗很多時間.



問題1:main函式下面一句,SeqList L;定義一個SeqList型別的變數L,那麼此時L中的陣列會被初始化麼?


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define MaxSize 20
typedef int ElemType;               /* typedef的意思是給int定一個別名ElemType,其實下面的ElemType elem [MaxSize]中的ElemType就是int,這樣做的好處是,當變數elem的型別需要變的時候,直接在此處修改就好,不需要每個ElemType都修改. */
typedef struct SeqList              /* 順序表結構定義,這個結構體代表的是一個順序表,順序表不就是一個數組麼?既然有了陣列,為什麼還要把length變數和陣列組織在一個結構體中?為什麼需要length,那是因為雖然申請了一個長度為20的陣列,但是順序表可能只佔這個陣列的一部分,比如,順序表的長度只有10,只佔了陣列的一半.而長度為20的陣列就是一個數組,這個長度為10的陣列才是一個順序表.這個順序表最大能儲存的元素長度不會大於這個申請了的陣列長度.這是一個侷限性,說明順序表長度是有一個限制的,這個限制就是包含它的陣列的長度.並不能無限制增加元素. */
{
	ElemType elem [MaxSize];
	int length;                     //順序表的長度.
}SeqList;                            //為struct SeqList這種資料型別定義一個別名SeqList,此時並未分配記憶體,只是宣告一個數據型別.
int Init_SeqList(SeqList &L)       /*  初始化,一個SeqList型別的結構體變數傳進來,把它的長度初始化為0,還有它的成員陣列應該在宣告這個結構體變數的時候就自然的初始化了.*/
{
	L.length=0;                   
	return 1;
}
int Locate_SeqList(SeqList &L,int x)       //在順序表L中,查詢元素X的位置,返回的是它在從1號數起的第幾個位置(不是從0)
{
	int i = 0;
	while(i<L.length&&L.elem[i]!=x)
		i++;
	if(i>L.length)
	{
		printf("順序表中不存在該元素!\n");
	    return 0;
	}
	else return i+1;
}
int Insert_SeqList(SeqList &L,int i,int x)      //在順序表L中,把元素x,插入第i個位置,從1數起,插入第1個位置就是在陣列下標0的位置.
{
	int j;
	if(L.length>MaxSize)
	{
		printf("順序表已滿,無法進行插入操作!");
	return 0;
	}
	if(i<=0||i>L.length+1)
	{
		printf("插入位置不正確!");
		return 0;
	}
	for(j=L.length-1;j>=i-1;j--)
	{	L.elem[j+1]=L.elem[j];  }
	L.elem[i-1]=x;
	L.length++;
	return 1;
}
int Delete_SeqList(SeqList &L,int i) //在順序表L中,刪除第i個元素(從1數起)
{
	int j;
	if((i<1)||(i>L.length))
	{
		printf("刪除位置不正確!");
		return 0;
	}
	for(j=i;j<L.length;j++)
		L.elem[j-1]=L.elem[j];
	L.length=1;
	return 1;
}
int Display_SeqList(SeqList L)			//依次顯示順序表中的元素
{
	int i;
	for(i=0;i<L.length;i++)
		printf("%d",L.elem[i]);
	return 1;
}
void main(){
	SeqList L;                   //定義一個名為L的順序表.
	ElemType e,x;
	int i=1,k,j;
	Init_SeqList(L);
	printf("初始化\n建立順序表如下:\n");
	
	Insert_SeqList(L,1,1);
	Display_SeqList(L);
	printf("\n");

    Insert_SeqList(L,2,2);
	Display_SeqList(L);
	printf("\n");
	
	Insert_SeqList(L,3,3);
	Display_SeqList(L);
	printf("\n");
	
	Insert_SeqList(L,4,4);
	Display_SeqList(L);
    printf("\n");

	while(i<=3)
	{
		printf("\n           主選單              \n");
		printf("\n     1   查詢指定元素          \n");
		printf("\n     2   插入元素到指定位置    \n");
		printf("\n     3   刪除某一位置指定元素  \n");
		printf("\n     0   結束程式              \n");
        printf("------------------------------------------\n");
		printf("請輸入您選擇的選單號:");
		scanf("%d",&i);
		switch(i)
		{
		case 1 :
			printf("請輸入查詢的元素:");
			scanf("%d",&x);
			j=Locate_SeqList(L,x);
			if(j!=0)
				printf("指定元素位置=%d\n",&j);
			break;
		case 2 :
			printf("請輸入插入的元素:");
			scanf("%d",&k);
			printf("請輸入插入元素值:");
			scanf("%d,&x");
			j=Insert_SeqList(L,k,x);
			if(j!=0)
			{
				printf("插入後順序表如下所示\n");
				Display_SeqList(L);
				printf("\n");
			}
			break;
		case 3 :
			printf("請輸入刪除的位置:");
			scanf("%d",&k);
			j=Delete_SeqList(L,k);
			if(j!=0)
			{
				printf("刪除後順序表如下所示\n");
				Display_SeqList(L);
				printf("\n");
			}
			break;
		case 0 :
			exit(0);
			break;
		default:
			printf("輸入有誤!");
		}
	}
}