数据结构中构建顺序表

     顺序表指的是数据元素在内存中连续分配地址的数组,由于指针无法指出数组长度,编译时不会报错,所有用结构体来表示一个顺序表:

顺序表用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))来分配内存。


         
       




  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烧技湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值