天天看點

資料結構中建構順序表

     順序表指的是資料元素在記憶體中連續配置設定位址的數組,由于指針無法指出數組長度,編譯時不會報錯,所有用結構體來表示一個順序表:

順序表用C語言的表示方法如下:

<span style="font-family: Arial, Helvetica, sans-serif;">  #define OK 1</span>
           
#define ERROR -1
  typedef int elem_type;
           
typedef int Statue;
 //  int Arrylength;
   typedef struct sqlist
   {
   	elem_type  *Arry;
   	int  Arrylength;
   	} Sqlist;
 
   //建立一個空表
  Statue Create_Sqlist(Sqlist *&S)
   {
    //S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type));

	//L = (sqlist *)malloc(sizeof(sqlist));
   // L->data = (char *)malloc(maxsize);
    S = (Sqlist *)malloc(sizeof(Sqlist)); 
	S->Arry = (elem_type *)malloc(MaxSize);
   	if(!S->Arry)
   		{
   			return ERROR;
   			}
   	else
   		{
   			S->Arrylength = 0;
   			return OK;
	    }
   	}

//順序表賦初始值
  void   Init_Sqlist(Sqlist *&S)
  {
  	int i;
  	for(i=0;i<20;i++)
  	{
  	   S->Arry[i]=rand()%100;
	   
  	   S->Arrylength++;
  	 }
  }
  	
//在第i個位置添加一個元素m
  Statue Insert_Sqlist(Sqlist *&S,int i,int InsertNum)
{
  	if(i<=0 && i>S->Arrylength) 
  		return ERROR;
  	else
  		{
  			int j;
  			for(j=0;j<=S->Arrylength-i;j++)
  			 S->Arry[S->Arrylength-j]=S->Arry[S->Arrylength-1-j];    //i以後元素往後移動一位
  			 S->Arry[i-1]=InsertNum;
  			 S->Arrylength++;
  			 return OK;
  		}
}

//将第i個元素删除
  Statue Delete_Sqlist(Sqlist *&S,int i)
{
  	if(i<=0 && i>S->Arrylength) 
  		return ERROR;
  	else
  		{
  			int j;
  			for(j=0;j<=S->Arrylength-i;j++)
  			  S->Arry[i-1+j]= S->Arry[i+j];
  			 S->Arrylength--;
  			 return OK;
  			}
}

//删除值為x的元素
  void DeleteX_Sqlist(Sqlist *&S,int x)
{
  	int i;
  	for(i=0;i< S->Arrylength;i++)
      {
      	if(x == S->Arry[i])	
      		{
      			//Delete_Sqlist( *S, i);
				int j;
  			    for(j=0;j<=S->Arrylength-i;j++)
  			      S->Arry[i+j]= S->Arry[i+j+1];
  			    S->Arrylength--;
      		}
      	}
}

  //列印函數
  void print(Sqlist *&S)
  { 
    int m;
	for(m=0;m<S->Arrylength;m++)		
		{
			cout<<setw(4)<<S->Arry[m];
			if((m+1)%4==0)
				cout<<endl;
	     }
  }

int main()
{
	Sqlist *p1;
    Create_Sqlist( p1);
	cout<<"建立順序表is OK"<<endl;
    Init_Sqlist(p1);
	cout<<"初始化順序表is OK,資料如下:"<<endl;
	print(p1); 

	int i,InsertNum;
	cout<<"輸入兩個如下:";
	cin>>i;cin>>InsertNum;
	cout<<"插入數操作如下:在第"<<i<<"行插入數字"<<InsertNum<<"後。結構顯示如下:"<<endl;
	Insert_Sqlist( p1, i, InsertNum);	
	print(p1);

	int k;
	cout<<endl;
	cout<<"輸入一個數如下:";
	cin>>k;
	cout<<"删除數操作如下:"<<endl;
	cout<<"想要删除第"<<k<<"個數 顯示如下:"<<endl;
    Delete_Sqlist(p1,k);	
    print(p1);

	int j;
	cout<<"輸入一個數"<<endl;
    cin>>j;
	cout<<"删除指定數操作如下:輸入想要删除的數是:"<<j<<"    結果顯示如下:"<<endl;
    DeleteX_Sqlist(p1,j);
	print(p1);

	while(1);
	return 0;
	}
           

        顯示結果如下:

資料結構中建構順序表

                分析比較下面代碼段的差别:

A段——建立空表沒有bug的代碼:

typedef struct sqlist
   {
   	elem_type  *Arry;
   	int  Arrylength;
   	} Sqlist;
 
   //建立一個空表
  Statue Create_Sqlist(Sqlist *&S)
   {
        S = (Sqlist *)malloc(sizeof(Sqlist)); 
	S->Arry = (elem_type *)malloc(MaxSize);
   	}
           

B段——建立空表出現bug的代碼:

typedef struct sqlist
   {
   	elem_type  Arry[MaxSize];
   	int  Arrylength;
   	} Sqlist;
 
   //建立一個空表
  Statue Create_Sqlist(Sqlist *S)
   {
    S->Arry = (elem_type *) malloc(MaxSize*sizeof(elem_type));  }
           

      A與B的主要差别是數組作為成員時的記憶體配置設定問題:

     A中隻是定義了一個elem_type 類型的 指針變量,是以在定義結構類型時還沒有給 *Arry配置設定記憶體,可以通過S->Arry = malloc(MaxSize)來配置設定記憶體;

     B中定義了數組類型Arry[MaxSize],一旦調用Sqlist類型,系統馬上自動給它配置設定記憶體,是以不需要再S->Arry = (elem_type *)malloc(MaxSize*sizeof(int))來配置設定記憶體。

繼續閱讀