2014 dxdy logo

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

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




 
 Помогите со списками в СИ
Сообщение10.03.2008, 00:48 
Помогите ,пожалуйста, решить задачу со списками в СИ.Необходимо создать список студентов, вывести список задом наперед,затем найти старшего по возрасту,удалить список. Заранее благодарен.

 
 
 
 
Сообщение10.03.2008, 03:08 
Аватара пользователя
:evil:
А какая помощь Вам нужна? До чего Вы уже дошли?

 
 
 
 
Сообщение10.03.2008, 11:17 
Как вывести список задом наперед?

 
 
 
 
Сообщение10.03.2008, 20:22 
Вам необходимо реализовать двунаправленный линейный список.

 
 
 
 
Сообщение10.03.2008, 20:46 
Аватара пользователя
Или пересчитать все элементы списка, а потом поочерёдно находить и выводить последний элемент списка, предпоследний, пред-предпоследний, и так далее до первого. Эффективность не обсуждаем.

 
 
 
 
Сообщение11.03.2008, 19:16 
Аватара пользователя
:evil:
Как Вы уже видите, вариантов много. Я предложу ещё пару:

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

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

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

 
 
 
 
Сообщение15.03.2008, 14:03 
Написал программу ,воспользовавшись вашим советом.Вроде все работает нормально,но преподаватель говорит , что есть ошибка в функции,которая находит максимальный элемент.Не могли бы вы ,пожалуйста,указать на ошибку.Вот программа:
#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 
Аватара пользователя
Забыли перейти к следующему элементу списка.

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

 
 
 
 
Сообщение18.03.2008, 19:33 
Аватара пользователя
Реализуй двунаправленный список и попробуй написать так:
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group