Не работает лишь одна функция MakeListWord Вывода слов в списке.
В функции AddList по условию добавляется три элемента списка.
/******************************************************/
void AddList(LIST *list,char *name,char *age, char *wgt)
{
LISTEL *listel=(LISTEL *)malloc(sizeof(listel));
if(listel==NULL) return;
listel->name=(char*)malloc(strlen(name)+1);
listel->age=(char*)malloc(strlen(age)+1);
listel->wgt=(char*)malloc(strlen(wgt)+1);
if(listel->name==NULL)
if(listel->age==NULL)
if(listel->wgt==NULL) return;
strcpy(listel->name, name);
strcpy(listel->age, age);
strcpy(listel->wgt, wgt);
listel->left=NULL;
listel->right=NULL;
printf("добавление элемента\n");
if(list->head==NULL)
{
list->head=list->tail=listel;
}
else
{
list->tail->left=listel;
listel->right=list->tail;
list->tail=listel;
}
list->size++;
}
/*******************************************************/
А в функции MakeListWord надо вставить строку в один элемент списка? Как это сделать?
/****************************************************/
void MakeListWord(char *exp, LIST *list)
{
char *begword, *word;
int len, i;
while(1)
{
while(*exp==' ') exp++;
begword=exp; len=0;
while(*exp) //определение длины слова
{
if(*exp!=' ')
{
len++;
exp++;
}
else break;
}
if(len==0) return;
//выделение слова
word=(char *)malloc(len+1);
for(i=0; i<len; i++) word[i]=begword[i];
word[len]='\0';
//запись слова в список
AddList(list,word); free(word);
}
}
///////////////////////////////////////////////////
Здравствуйте, Deposit, Вы писали:
Сперва надо было написать, что у тебя за структура данных.
Как я понимаю какая-то двусвязная очередь. Читать такой код столь же сложно как и писать его.
Надо было привести объявления структур LIST и LISTEL. Вообще названия не подходящие, я потратил много времени на размышления только из-за того, что не заметил что это разные типы данных. Назвал бы LIST и PHONE.
Далее будет не совсем красиво, но с минимальными усилиями твоя проблема решается заменой
AddList(list,word);
На
AddList(list,word, "", "");
Далее вот это не верно
if(listel->name==NULL)
if(listel->age==NULL)
if(listel->wgt==NULL) return;
У тебя под name может запроситься 1 кб, а под другое поле 200 кб. И ошибка не будет отслежена.
Чтобы не возникало проблем с вызовом функции ее лучше писать в виде
void AddList(LIST *list, LISTEL* tel);
Тогда код функции будет короче и понятнее. Правда при этом надо будет писать функцию выделения памяти для полей структуры и заполнения их.
Здравствуйте, Deposit, Вы писали:
и прежде чем задавать вопрос потрать немного своих сил на то чтобы тебе было удобно отвечать
кстати у вас вместо
LISTEL *listel=(LISTEL *)malloc(sizeof(listel));
скорее всего надо было бы написать
LISTEL *listel=(LISTEL *)malloc(sizeof(LISTEL));
Хотя С и не поддерживает ООП полностью, удобства некоторые все таки можно самому для себя создать.