LINUX.ORG.RU

Простой вопрос насчёт списков для профессионалов .

 ,


0

2

Делаю задание со списками. Компилятор выдаёт ошибку. В чём может быть проблема ?

#include <stdio.h>

#include <stdlib.h>

#define KOL 3 /*количество произвольных чисел*/

struct data

{

int a;

};

struct list
{

data d;

list *next;

};

void print(list *ptr);

void insert(list **u, data &x);





int main(int argc, char *argv[])

{



if(argc != 2){

printf("Error.");

return 1;

}



FILE *f;

int *arr, i, cnt;

list *u = NULL;

data x;



if ( ( f = fopen(argv[1], "r") ) == NULL ){

fprintf(stderr, "can't open file %s for input!\n", argv[1]);

exit(1);

}

cnt = 0;

while ( fscanf(f, "%d", &i) == 1 ){

if ( ( arr = (int*)realloc(arr, sizeof(int) * (cnt + 1)) ) == NULL ){

fprintf(stderr, "Memory error!\n");

fclose(f);

exit(1);

}

x.a = i;

insert(&u, x);

} 

fclose(f);



print(u);



for(int j = 0; j < KOL; j++){ /* вводи дополнительные числа */

printf("number %d>", j);

scanf("%d", &i);

x.a = i;

insert(&u, x); 

} 

print(u);



return 0;

}

/*функция вставки*/

void insert(list **u, Data &x)

{

/* вставка в список одного элемента перед элементом,*/

/*меньшим или равным данному x*/

list *p = new List;

p->d.a = x.a;

if(*u == 0) /* исходный список пуст - вставка в начало */

{

p->next = 0;

*u = p;

return;

}

list *t = *u;

if(t->d.a <= p->d.a) /* исходный список не пуст -

вставка в начало */

{

p->next = t;

*u = p;

return;

}

list *t1 = t->next;

while(t1)

{

if(t->d.a > p->d.a && p->d.a >= t1->d.a)

{ /* вставка в середину */

t->next = p;

p->next = t1;

return;

}

t = t1;

t1 = t1->next;

}

t->next = p; /* добавляем в конец списка */

p->next = 0;

}

/* функция вывода */

void print(List *ptr){

while(ptr){

printf("%d", (ptr->d).a);

ptr = ptr->next; 

}

}
 

Компилятор выдаёт ошибку

Где выхлоп компилятора-то?

yoghurt ★★★★★ ()
Ответ на: комментарий от Sneezy

struct List твой тип, а не лист, а вообще используй typedef, люк.

Freyr69 ★★★ ()
Ответ на: комментарий от Freyr69

покажите пожалуйста, как примерно должно выглядеть. Есть смысл вместо date и list оставить что-то одно и просто слить их?

Sneezy ()
Ответ на: комментарий от Sneezy

Выше, а вообще делаешь так:

typedef struct list {
data d;
struct list * next;
} LIST;

void print(LIST * ptr);
Freyr69 ★★★ ()
Ответ на: комментарий от Freyr69

спасибо. просто в одно время отправили. сейчас попробую

Sneezy ()
Ответ на: комментарий от Sneezy

list *p = new List;

Так, советую узнать, что такое си, что такое си++, почитай того же Прату, это разные языки, в си++ твой код должен собираться и без typedef, собирай g++.

Freyr69 ★★★ ()
Ответ на: комментарий от Sneezy

Тогда тебе следует выучить си. И читай сообщения компилятора.

В insert тоже LIST вместо list, очевидно же, никаких new там не может быть, собирать надо с --std=c99, иначе никаких инициализаций переменных в цикле.

Freyr69 ★★★ ()

1. попробуй всё тоже самое с эмулировать на своём массиве структур( а можно даже начать с пары массивов полей)

т.е

a. эмуляция списка посредством пары массивов.

б. эмуляция списка посредством массива структур.

в. использование явной динамической памяти.

вот пиши свою задачу с вариантами а.б.в.

так и разберёшься.

ибо ща слишком много тебе нехватает знания.

qulinxao ★★☆ ()
Ответ на: комментарий от qulinxao

я даже не представляю, сколько времени это займёт. Завтра надо сдать уже. мне главное сейчас чтобы прога рабочей была, а разберусь как сдам.

Sneezy ()
astyle --style=ansi ./rk3.c
Dron ★★★★★ ()
Ответ на: комментарий от Sneezy

а разберусь как сдам

лжёшь

если разбираться а не попрошайничать то получаса на все 3 варианта от самого нетребовательного к пониманию синтаксиса языка (только массивы и индексы) переходом через синтаксис структур в с, с окончанием на использовании malloc|free

вполне хватит.

qulinxao ★★☆ ()

начни с пустого файла, вида:

#include <stdio.h>
int main(int argc, char* argv[])
{
  return 0;
}
затем, добавляй по строчке и собирай получившееся, как найдешь первую ошибку размышляй почему она произошла, или спрашивай, когда уже не можешь исправить. в вопросе укажи что уже пытался сделать и сообщение компилятора.

anonymous ()
Ответ на: комментарий от Sneezy

лжёшь.

ибо там указания и сырцы которые вбить и компильнуть

вкуривать это и делать.

qulinxao ★★☆ ()
Ответ на: комментарий от qulinxao

да смысл мне лгать? То есть, там шаблоны которые вбить и прога заработает?

Sneezy ()
Ответ на: комментарий от qulinxao

это всё объясняет. с этого и нужно было начинать, мистер умник

Sneezy ()
Ответ на: комментарий от yoghurt

Начни с замены struct на typedef struct :)

кирпичем по роже за такие советы

x4DA ★★★★★ ()
Ответ на: комментарий от x4DA

я там понял вся проблема в этих двух вещах struct Data{ int a; };

struct List{ Data d; List *next; };

что-то не так получается. Но как это исправить?

Sneezy ()

Рака яичек полудуркам, помогающим студентам-дегенератам спихнуть зачёт.

aedeph_ ★★ ()
Ответ на: комментарий от Sneezy

У тебя там куча проблем, с указателями, оперетором new и передачей значения по ссылками (чего в Си нету)

x4DA ★★★★★ ()
Ответ на: комментарий от aedeph_

ну так норм же, не будут потом конкуренцию профессионалам составлять

x4DA ★★★★★ ()
Ответ на: комментарий от x4DA

Грош цена тому профессионалу, которой боится конкуренции.

aedeph_ ★★ ()

It's a _mistake_ to use typedef for structures and pointers.

Из Kernel Coding Style.

Забей на тех советчиков и не используй typedef.

anonymous ()
Ответ на: комментарий от anonymous

It's a _mistake_ to use typedef for structures and pointers.

Ага и там же далее исключения под которые прекрасно подходит LIST.

bj ()

Вероятно, имелось в виду что-то подобное:

#include <stdlib.h>
#include <stdio.h>

struct data {
  int a;
};

struct node {
  struct node *next;
  struct data d;
};

struct node * 
newnode (int x, struct node *n) {
  struct node *p = malloc(sizeof(struct node));
  if (p) {
    p->d.a=x;
    p->next=n;
  }
  return p;
}

void 
insert(struct node **lst, int x) {
  if (!lst) return;
  struct node **p;
  p=lst;
  while (*p && (*p)->d.a<x) p=&((*p)->next);
  (*p)=newnode(x,*p);
}

void 
print(struct node *lst) {
  while (lst) {
    printf("%d ",lst->d.a);
    lst=lst->next;
  }
}

int main(int argc, char **argv) {
  struct node *lst = NULL;
  for (int i=5; i>0; i--) insert(&lst,i);
  print(lst); printf("\n");
  return 0;
}

bormant ★★★★★ ()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

Вероятно, имелось в виду что-то подобное:

ну и нафига? не вчитывался, но на первый взгляд твой код осмысленен :) нафига неучу нахаляву помогать?

pef-secure ()
Ответ на: комментарий от pef-secure

нафига неучу нахаляву помогать?

Если ключевое слово «нахаляву», то эти 45 строк не стоят ни ломаного яйца, ни выеденного гроша. Если ключевое слово «неучу», то от меня точно не убудет, прибавится ли у него — от него только и зависит. Если ключевое слово «помогать», то хобби такое и «настроение улучшилось» (q).

осмысленен

ну почему же, вот в insert() ненужная лишняя пременная. достаточно:

void 
insert(struct node **lst, int x) {
  if (!lst) return;
  while (*lst && (*lst)->d.a<x) lst=&((*lst)->next);
  (*lst)=newnode(x,*lst);
}

bormant ★★★★★ ()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от pef-secure

Или чуть менее деструктивно (теоретически, на случай возможности возврата NULL из malloc()):

void
insert(struct node **lst, int x) {
  struct node *p;
  if (!lst) return;
  while (*lst && (*lst)->d.a<x) lst=&((*lst)->next);
  if ((p=newnode(x,*lst))) *lst=p;
}

bormant ★★★★★ ()
Последнее исправление: bormant (всего исправлений: 1)

Я думаю компилятор хотел набить тебе рожу за комментарии на русском и отсутствие отступов, но в конце решил ограничиться ошибкой.

morse ★★★★★ ()
Ответ на: комментарий от bj

Ага и там же далее исключения под которые прекрасно подходит LIST.

Да ну? И под какие же исключения он подходит?

anonymous ()
Ответ на: комментарий от aedeph_

Рака яичек полудуркам, помогающим студентам-дегенератам спихнуть зачёт.

Мде... Вот так думаешь что человек - чмо, а потом бац! И в самом деле так.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

У фашика опять бомбануло - день прожит не зря.

aedeph_ ★★ ()
Ответ на: комментарий от aedeph_

Зря. Про фашиков не знаю, но ты нинужен.

anonymous ()
Ответ на: комментарий от Freyr69

LIST;

микрософт головного мозга какой-то

invy ★★★★★ ()
Ответ на: комментарий от qulinxao

а разберусь как сдам

лжёшь

Опередил.

loz ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.