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; 

}

}
 


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

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

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
()
Ответ на: комментарий от qulinxao

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

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

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

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

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

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

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

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

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

aedeph_ ★★
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от aedeph_

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

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

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

лжёшь

Опередил.

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