zoukankan      html  css  js  c++  java
  • 顺序表的错误

    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("请输入学生的姓名与年龄:
    ");
    
    
         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
    ",stu[k-1].name,stu[k-1].age);
    
    
       }
    
    
       //删除stu2 ,删除线性表的第三个元素 
    
    
       DataType st=DelList(&L,3);
    
    
       printf("删除学生的name:%s,age:%d
    ",st.name,st.age);
    
    
       for(j=1;j<=L.size;j++){
    
    
       		GetData(&L,j);
    
    
       	printf("name:%s,age:%d
    ",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("请输入学生的姓名与年龄:
    ");
         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
    ",Q.data->name,Q.data->age);
       	Q.data++;
       }
       //删除线性表的第三个元素 
       DataType st=DelList(&L,3);
       printf("删除学生的name:%s,age:%d
    ",st.name,st.age);
       Q=L;
       for(j=1;j<=L.size;j++){
       	printf("name:%s,age:%d
    ",Q.data->name,Q.data->age);
       	Q.data++;
       }
     	return;
     }
    
  • 相关阅读:
    关于 android studio 3.2打开后一直下载中,最后还失败了 的解决方法
    Android app退出(AppManager对Activity的管理)
    关于 android studio 找错
    webpack3 版本问题
    phpstorm中webpack快速执行脚本转换scss至css
    v-bind:class失效问题
    php(2)—基础补充
    phpstorm配置Apache服务器
    php(1)—基础
    中醫學習
  • 原文地址:https://www.cnblogs.com/glory-yl/p/14613106.html
Copyright © 2011-2022 走看看