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;
}