问题遇到的现象和发生背景
删除顺序表范围元素失败
问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#define initSize 3
typedef int DataType;
typedef struct SeqList{
DataType *data;
int length;
int size;
}SeqList;
void initSeqList(SeqList * L){
L->data=(DataType*)malloc(sizeof(DataType)*initSize);
if(L->data==NULL){
printf("初始化顺序表失败");
return;
}
L->length=0;
L->size=initSize;
}
void addElement(SeqList *L,DataType ele){
if(L->length>=L->size){
DataType *p=L->data;
int newSize=L->size*2;
L->data=(DataType*)malloc(sizeof(DataType)*newSize);
for(int i=0;i<L->length;i++){
L->data[i]=p[i];
}
L->size=newSize;
free(p);
}
//这里使用length作为存入元素的索引刚好是上一个元素之后的位置
L->data[L->length]=ele;
L->length++;
}
void dataDelete(SeqList *L,DataType data){
for(int i=0;i<L->length;i++){
if(L->data[i]==data){
//i是需要删除元素的索引
for(int j=i;j<L->length-1;j++){
L->data[j]=L->data[j+1];
}
L->length--;
return ;
}
}
printf("顺序表中无该元素\n");
}
void rangeDelete(SeqList *L,int inputMin,int inputMax){
if(L->data==NULL){
printf("顺序表为空删除失败\n");
return ;
}
int max=L->data[0];
int min=L->data[0];
//找到顺序表中的最大值和最小值
for(int i=0;i<L->length;i++){
int tempEle=L->data[i];
if(tempEle>max){
max=tempEle;
}
if(tempEle<min){
min=tempEle;
}
}
//此判断语句容易漏写条件
if(inputMin<min||inputMin>max||inputMax<min||inputMax>max){
printf("输入的范围有误删除失败\n");
return;
}
//用于统计在范围内的元素有多少个
int count=1;
//用于存储最小值
DataType *minEleArr=(DataType*)malloc(sizeof(DataType)*(L->length));
for(int i=0;i<L->length;i++){
int tempEle=L->data[i];
if(tempEle>=inputMin&&tempEle<=inputMax){
//发现在输入范围内的数据进行删除
minEleArr[count-1]=tempEle;
printf("%d ",tempEle);
count++;
}
}
printf("\n");
/* for(int i=0;i<count;i++){
dataDelete(&L,(DataType)minEleArr[i]);
}*/
for(int i=0;i<count-1;i++){
dataDelete(&L,minEleArr[i]);
}
}
void ergodic(SeqList *L){
printf("[");
for(int i=0;i<L->length;i++)
if(i!=L->length-1){
printf("%d, ",L->data[i]);
}else{
printf("%d]",L->data[i]);
}
printf("\n");
}
int main()
{
SeqList L;
initSeqList(&L);
addElement(&L,11);
addElement(&L,12);
addElement(&L,9);
addElement(&L,15);
addElement(&L,3);
ergodic(&L);
rangeDelete(&L,10,15);
ergodic(&L);
return 0;
}