2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите со списками в СИ
Сообщение10.03.2008, 00:48 


06/10/07
68
Sverige
Помогите ,пожалуйста, решить задачу со списками в СИ.Необходимо создать список студентов, вывести список задом наперед,затем найти старшего по возрасту,удалить список. Заранее благодарен.

 Профиль  
                  
 
 
Сообщение10.03.2008, 03:08 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
А какая помощь Вам нужна? До чего Вы уже дошли?

 Профиль  
                  
 
 
Сообщение10.03.2008, 11:17 


06/10/07
68
Sverige
Как вывести список задом наперед?

 Профиль  
                  
 
 
Сообщение10.03.2008, 20:22 


27/11/05
183
Северодонецк
Вам необходимо реализовать двунаправленный линейный список.

 Профиль  
                  
 
 
Сообщение10.03.2008, 20:46 
Заслуженный участник
Аватара пользователя


23/07/05
17976
Москва
Или пересчитать все элементы списка, а потом поочерёдно находить и выводить последний элемент списка, предпоследний, пред-предпоследний, и так далее до первого. Эффективность не обсуждаем.

 Профиль  
                  
 
 
Сообщение11.03.2008, 19:16 
Заслуженный участник
Аватара пользователя


17/10/05
3709
:evil:
Как Вы уже видите, вариантов много. Я предложу ещё пару:

1) Напишите рекурсивную функцию. Я подозреваю, что от Вас хотят именно этого. Функция делает немного: если остаток списка после текущего элемента (хвост) не пуст, вызывает сама себя, передавая параметром этот хвост. А после этого печатает текущий элемент списка.

2) напишите дополнительную функцию, которая переставляет элементы списка в обратном порядке. После чего Ваша задача решается в три шага: инвертировать порядок, напечатать список в новом прямом порядке, инвертировать список (приводя его в первоначальное состояние).

Оба способа достаточно эффективны. Как и у всего на свете, у них есть недостатки: первый может переполнить стек вызовов, второй изменяет список (что может быть недопустимо).

 Профиль  
                  
 
 
Сообщение15.03.2008, 14:03 


06/10/07
68
Sverige
Написал программу ,воспользовавшись вашим советом.Вроде все работает нормально,но преподаватель говорит , что есть ошибка в функции,которая находит максимальный элемент.Не могли бы вы ,пожалуйста,указать на ошибку.Вот программа:
#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#define N 3
struct car {
char name[50];
char price[50];
unsigned char year;
struct car* next;
} ;

struct car* InputElement(){
struct car* p=(struct car*)malloc(sizeof(struct car));
printf("input name:\n");
scanf("%s",p->name);
printf("input price:\n");
scanf("%s",p->price);
printf("input age:\n");
scanf("%d",&(p->year));
p->next=NULL;
return p;
};

struct car* AddToList(struct car* root,struct car* p){
if(NULL==p)
return root;
p->next=root;
return p;
};

void Max(struct car* p){
int max;
if(p!=NULL){
for(int i=0;i<N;i++){
if(i==0)
max=p->year;

if(max<p->year)
max=p->year;
};
};
printf("The oldest car is %d\n**********************\n",max);
};

void Output(struct car* p){
while(p!=NULL){
printf("%s\t",p->name);
printf("%d\t",p->price);
printf("%d\n",p->year);
p=p->next;
if(p==NULL)
break;
};
Output(p);
};

void FreeList(struct car* root){
if(NULL==root)
return;
struct car* q=root;
struct car* p=root->next;
while (q){
free(q);
q=p;
if(q)
p=q->next;
};
};

struct car* root=NULL;

void main(){
for(int i=0;i<N;i++){
root=AddToList(root,InputElement());
};
Max(root);
Output(root);
FreeList(root);
}

 Профиль  
                  
 
 
Сообщение15.03.2008, 14:35 
Заслуженный участник
Аватара пользователя


01/08/06
3132
Уфа
Забыли перейти к следующему элементу списка.

 Профиль  
                  
 
 
Сообщение15.03.2008, 14:59 


27/11/05
183
Северодонецк
В функции Max не выполняется переадресация элементов списка (аналогично тому, как это сделано в Output, например). Лексическое замечание - обычно точка запятой не ставится после закрывающей фигурной скобки, предназначенной для определения блока. Точка с запятой необходима при определении структур, классов, перечислений. А что - печать в обратном направлении потеряла свою актуальность?

 Профиль  
                  
 
 
Сообщение18.03.2008, 19:33 
Аватара пользователя


01/12/07
172
Реализуй двунаправленный список и попробуй написать так:
void Max(struct car* root){
struct car* q=root;
int max;
while(q->next!=NULL){

if(q->prev==NULL){
max=q->year;
};

if (q->next->year>max) {
max=q->next->year;
};
q=q->next;
};

printf("The oldest car is %d\n**********************\n",max);

}; :wink: 8-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group