c语言实现的顺序存储的线性表删除元素出现错误

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

你用的是头插法,你的存储顺序和你的插入顺序相反。你每次插入的位置都是1,就把前面插入的元素挤到后面去了,即98行。按你本来想顺序存储的想法来的话应该是InsList(&L,i+1,stu[i]);,这样你的元素就会和插入顺序一致

为什么你前面的输出时对的呢?因为你输出的是stu[]数组的元素,你的输出和你的线性表一点关系都没有。你的GetData的确调用了,可是这个函数的返回值你并没有做任何处理。即101行和102行

你的删除函数没有问题,删除的是第三个元素,只是你以为你的第三个元素是c罢了。

你最后的输出也是一样的,跟你的线性表无关,没有对返回值做任何处理。

只对主函数部分修改即可

int 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++;
       }
       //删除stu2 ,删除线性表的第三个元素 
       DataType st = DelList(&L,3);
       printf("删除学生的name:%s,age:%d\n",st.name,st.age);
       Q = L;
       for(k=1;k<L.size+1;k++){
           printf("name:%s,age:%d\n",Q.data->name,Q.data->age);
           Q.data++;
       }
     return 0;
}

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632