顺序存储线性表

c语言数据结构的错误笔记

错误原因:代码的各个函数都没有问题,经过csdn上面的问答,了解到了是主函数出了问题,按我的思想是实现顺序存储然后再顺序输出,对于插入函数我没有意识到我用的是头插法,每次插入都是插入到线性表的第一个元素中,主要原因是把线性表的输出与数组的输出混一起了,数组的存储顺序与线性表的存储顺序不相关。

错误代码如下:

#include<stdio.h>


#include<stdlib.h>


#define add_size 2


//定义线性表的数据类型 


 typedef struct student{


	char name[10];


	int age;


}student;


typedef student DataType;


//定义顺序存储线动态线性表 


typedef struct List{


	DataType *data;


	int size;


	int Max_Size;


}SqList;


//以原有最大内存的两倍扩展内存 


void againMalloc(struct List *L){


	DataType *p=(DataType*)realloc(L->data,add_size*L->Max_Size*sizeof(DataType));


	if(!p){


		printf("分配存储空间失败!");


		exit(1);


	}


	L->data=p;


	L->Max_Size=add_size*L->Max_Size;


	return;


}


//初始化线性表


void InitList(struct List*L,int ml)


{


	if(ml<=0){


		printf("Max_Size非法!");


		exit(1);


	}


	L->Max_Size=ml;


	L->size=0;


	L->data=(DataType*)malloc(ml*sizeof(DataType));


	if(!L->data){


		printf("空间分配失败!");


		exit(1);


	}


	return;


 } 


 


 //线性表的元素插入


 void InsList(struct List*L,int i,DataType elem) 


 {


 	int j;


 	if(i<1||i>L->size+1){


 		printf("越界插入,插入失败!");


 		exit(1);


	 }


	if(L->size==L->Max_Size){


		againMalloc(L); 


	}


	for(j=L->size-1;j>=i-1;j--){


		L->data[j+1]=L->data[j];


	}


	L->data[i-1]=elem;


	L->size++;


	return;


 }


 


 //元素的查看


 DataType GetData(struct List*L,int i)


 {


 	DataType elem;


 	if(i<1||i>L->size){


 		printf("越界查找,查找失败!");


 		exit(1);


	 }


	elem=L->data[i-1];


	return elem;


 } 


  //元素的删除


 DataType DelList(struct List*L,int i)


 {


 	int k;


 	if(i<1||i>L->size){


 		printf("删除越界,删除失败!");


		 exit(1); 


	 }


	 DataType elem=GetData(L,i);


	 for(k=i;k<L->size;k++){


	 	L->data[k-1]=L->data[k];


	 }


	 L->size--;


	 return elem;


  } 


  //主函数 


 void main(){


   SqList L;


    InitList(&L,10);


   DataType stu[3];


   int i,k,j;


   for(i=0;i<3;i++){


   	 printf("请输入学生的姓名与年龄:\n");


     scanf("%s %d",&stu[i].name,&stu[i].age);


     InsList(&L,1,stu[i]);


   }


   for(k=1;k<L.size+1;k++){


   	GetData(&L,k);


   	printf("name:%s,age:%d\n",stu[k-1].name,stu[k-1].age);


   }


   //删除stu2 ,删除线性表的第三个元素 


   DataType st=DelList(&L,3);


   printf("删除学生的name:%s,age:%d\n",st.name,st.age);


   for(j=1;j<=L.size;j++){


   		GetData(&L,j);


   	printf("name:%s,age:%d\n",stu[j].name,stu[j].age);


   }


 	return;


 }

改正后的代码

#include<stdio.h>
#include<stdlib.h>
#define add_size 2
//定义线性表的数据类型 
 typedef struct student{
	char name[10];
	int age;
}student;
typedef student DataType;
//定义顺序存储线动态线性表 
typedef struct List{
	DataType *data;
	int size;
	int Max_Size;
}SqList;
//以原有最大内存的两倍扩展内存 
void againMalloc(struct List *L){
	DataType *p=(DataType*)realloc(L->data,add_size*L->Max_Size*sizeof(DataType));
	if(!p){
		printf("分配存储空间失败!");
		exit(1);
	}
	L->data=p;
	L->Max_Size=add_size*L->Max_Size;
	return;
}
//初始化线性表
void InitList(struct List*L,int ml)
{
	if(ml<=0){
		printf("Max_Size非法!");
		exit(1);
	}
	L->Max_Size=ml;
	L->size=0;
	L->data=(DataType*)malloc(ml*sizeof(DataType));
	if(!L->data){
		printf("空间分配失败!");
		exit(1);
	}
	return;
 } 

 //线性表的元素插入
 void InsList(struct List*L,int i,DataType elem) 
 {
 	int j;
 	if(i<1||i>L->size+1){
 		printf("越界插入,插入失败!");
 		exit(1);
	 }
	if(L->size==L->Max_Size){
		againMalloc(L); 
	}
	for(j=L->size-1;j>=i-1;j--){
		L->data[j+1]=L->data[j];
	}
	L->data[i-1]=elem;
	L->size++;
	return;
 }

 //元素的查看
 DataType GetData(struct List*L,int i)
 {
 	DataType elem;
 	if(i<1||i>L->size){
 		printf("越界查找,查找失败!");
 		exit(1);
	 }
	elem=L->data[i-1];
	return elem;
 } 
  //元素的删除
 DataType DelList(struct List*L,int i)
 {
 	int k;
 	if(i<1||i>L->size){
 		printf("删除越界,删除失败!");
		 exit(1); 
	 }
	 DataType elem=GetData(L,i);
	 for(k=i;k<L->size;k++){
	 	L->data[k-1]=L->data[k];
	 }
	 L->size--;
	 return elem;
  } 
  //主函数 
 void main(){
   SqList L,Q;
    InitList(&L,10);
   DataType stu[3];
   int i,k,j;
   for(i=0;i<3;i++){
   	 printf("请输入学生的姓名与年龄:\n");
     scanf("%s %d",&stu[i].name,&stu[i].age);
     InsList(&L,i+1,stu[i]);
   }
   Q=L; 
   for(k=1;k<L.size+1;k++){
   	printf("name:%s,age:%d\n",Q.data->name,Q.data->age);
   	Q.data++;
   }
   //删除线性表的第三个元素 
   DataType st=DelList(&L,3);
   printf("删除学生的name:%s,age:%d\n",st.name,st.age);
   Q=L;
   for(j=1;j<=L.size;j++){
   	printf("name:%s,age:%d\n",Q.data->name,Q.data->age);
   	Q.data++;
   }
 	return;
 }
上一篇:手写简易的jQuery 考虑插件和扩展性


下一篇:即时通信(二)--- 腾讯云IM接入具体实现