Вы используете &
слишком много в merge
коде
void merge(SqList *La, SqList *Lb){
int i;
ElemType e;
for(i=0;i<Lb->length;i++){
e=GetElem(Lb,i);
if(!LocateElem(La,e))
ListInsert(La,e);
}
}
, тогда это не вызывает ошибки, но я не проверял, правильна ли "логика" (полагаю, это)
Добавить
Также необходимо исправить ListInsert:
void ListInsert(SqList *L, ElemType e){
int n = L->length;
L->data[n]=e;
L->length++;
}
Ваша версия пропускает элемент массива, так как вы используете "«увеличенный размер» для индексации нового элемента, в то время как новое вставленное значение должно быть помещено в индекс L->length
, а затем вам нужно увеличить длину массива (последний элемент массива размера N равен N-1, поэтому увеличивающий размерN + 1, последний элемент будет иметь индекс N).
Конечно, вы не проверяете границы массива, поэтому вы можете столкнуться с проблемами, если вставите больше, чем элементы MAXSIZE.
Добавить 2
Ваш LocateElem тоже нуждается в исправлении:
int LocateElem(SqList *L, ElemType e){
int i;
for(i=1;i<=L->length;i++){
if(L->data[i]==e){
return i;
}
}
return 0;
}
(я сохранил вашу идею использовать 0 в качестве специального значения для not found, хотя читал комментарий об этоми речь MAXSIZE, более того, необходимо исправлять большую часть вашего кода, чтобы использовать его последовательно).Здесь исправление касается того факта, что вы вернулись, когда обнаружили, что первый элемент не равен e, в то время как (я полагаю) вы хотите вернуть 0, если вы не найдете элемент, или что-то не-0, если вы его нашли.Этот фиксированный код исследует весь массив (начиная с 1, если вы зарезервировали индекс 0 для специального значения)