Подскажите как сделать правильнее?
От: Deposit Россия  
Дата: 18.01.06 13:20
Оценка:
Не работает лишь одна функция 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);
   }
  }
///////////////////////////////////////////////////
Re: Подскажите как сделать правильнее?
От: DigitalGuru Россия http://svetlyak.ru
Дата: 18.01.06 13:38
Оценка:
Здравствуйте, Deposit, Вы писали:

D>Не работает лишь одна функция MakeListWord Вывода слов в списке.

D>В функции AddList по условию добавляется три элемента списка.

На С++ можно было бы гораздо проще это написать. А тебе обязательно на С надо?
Re[2]: Подскажите как сделать правильнее?
От: Deposit Россия  
Дата: 18.01.06 13:54
Оценка:
Здравствуйте, DigitalGuru, Вы писали:

А тебе обязательно на С надо?

Надо только на С. Может сделать отдельную функцию AddListMake ?
Re: Подскажите как сделать правильнее?
От: runtime2  
Дата: 19.01.06 16:17
Оценка:
Здравствуйте, 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);

Тогда код функции будет короче и понятнее. Правда при этом надо будет писать функцию выделения памяти для полей структуры и заполнения их.
Re: Подскажите как сделать правильнее?
От: runtime2  
Дата: 19.01.06 16:19
Оценка:
Здравствуйте, Deposit, Вы писали:

и прежде чем задавать вопрос потрать немного своих сил на то чтобы тебе было удобно отвечать
Re: Подскажите как сделать правильнее?
От: Yozh_Programmer  
Дата: 19.01.06 17:25
Оценка:
кстати у вас вместо

LISTEL *listel=(LISTEL *)malloc(sizeof(listel));


скорее всего надо было бы написать

LISTEL *listel=(LISTEL *)malloc(sizeof(LISTEL));


Хотя С и не поддерживает ООП полностью, удобства некоторые все таки можно самому для себя создать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.