![]() |
Двухсвязанный список на Си.
Вложений: 1
1. Постановка вопроса.
- В данную задачу необходимо реализовать средствами языка Си. - Необходимо организовать двухсвязанный список, т.е. создать его и загрузить в оперативную память, а затем производить различные манипуляции с элементами этого списка (всё сводится к поиску и сортировке). - Полностью код выкладывать не буду (считаю будет только загромождать), покажу только, то с чем проблема. Код:
#include <stdio.h> (record *prior, *next;), и структуру (sps) типа expt. Создаем и загружаем в оперативную память список в операторе switch{case '2':.........}. Здесь, я думаю, что сделал всё верно. Прикреплю блок-схему http://forum.oszone.net/attachment.p...tid=1976&stc=1. 2. Вопрос. - В операторе switch{case '3':.........} хочу вывести все элементы списка на экран, но не выходит аленький цветочек. Всё компилируется, ошибок никаких не выдается, только одно предупреждение (" 'last' is assigned a value that is never used"),запускаем *.exe файл, ввожу в список записи, затем пытаюсь просмотреть, выползает окошко с ошибкой ("Thread stopped D:\BC5\bin\cs.c Fault: access violation at ..... read of address ........"), и всё на этом, программа останавливается. Убираю цикл while по крайней мере выводит правильно первый элемент. В чём моя ошибка? Где собака зарыта? |
Hemp
а почему не использовать STL-левский шаблон для списков? |
Vlad Drakula
Потому, что сессия не за горами, потому, что требуют на языке Си использовать списки, С++ нельзя использовать, шаблоны здесь не пойдут. Задачу решил следующим образом, функция views() правильно отображает данные из списка. Код:
#include <stdio.h> При запуске программы, данные из файла db1.dat (конечно, если, они на этот момент существуют), должны должны загружаться в оперативную память. Вот участок кода: Код:
FILE *f; В чём заключается ошибка? Как это реализовать? |
-> fscanf(f,"%s",&last->sps.sport);
По-моему, нужно очень осторожно работать с fscanf. Вот данный конкретный - он считает что? Всё до символа конца строки? Слово до пробела? До некоего разделителя? Или вообще всё до конца файла? |
hasherfrog
Всё верно. разделители нужны.... Считать данные из файла в двухсвязанный список получилось. Функция views() отображает на экран данные из памяти. Функция save() -- записывает в фаил из списка. Перед каждым элементом структуры record, переходим на новую сторку (т.е.разграничиваем --- fprintf(f,"\n%1d",list->sps.expert);). функия load() -- считывает из файла в список. Вот код: Код:
...... |
Ещё вопрос, теперь по сортировке.
Необходимо отсортировать двухсвязанный список в порядке возрастания по элементу sps->expert с помощью функции form1(). Допустим есть изначально следующий список (функция views()): | expert | family | ochki | |--------------------------------| | 7 | krotov | 3 | | 7 | popov | 2 | | 7 | sidopov | 1 | | 2 | semenov | 3 | | 2 | sidopov | 2 | | 2 | ivanov | 1 | | 4 | sidorov | 3 | | 4 | chein | 2 | | 4 | petrov | 1 | |--------------------------------| Необходимо получить вот такой следующий: expert | family | ochki | |--------------------------------| | 2 | semenov | 3 | | 2 | sidopov | 2 | | 2 | ivanov | 1 | | 4 | sidorov | 3 | | 4 | chein | 2 | | 4 | petrov | 1 | | 7 | krotov | 3 | | 7 | popov | 2 | | 7 | sidopov | 1 | |--------------------------------| Получается такой: expert | family | ochki | |--------------------------------| | 7 | krotov | 3 | | 7 | popov | 2 | | 7 | sidopov | 1 | |--------------------------------| В чём моя ошибка? Помогите разобраться. Код:
#define TRUE 1 |
Ух, какой кошмарный swap двух елементов :-E
Затираете где-то указатель, имхо, сразу тут: last->next->prior=list; Кто такой last->next->prior? Это ведь last? Получаем last = list; Брррррррррррр... Мозги скрутились... Last, List... Может last->next.prior? |
Вложений: 1
hasherfrog
если делаем вот так: Код:
//is_sort=FALSE; // чтобы ещё раз просмотреть список..... Перед последней итерацией данного цикла список выглядит так: |--------------------------------| | expert | family | ochki | |--------------------------------| | 7 | krotov | 3 | | 2 | semenov | 3 | | 2 | sidopov | 2 | | 2 | ivanov | 1 | | 4 | sidorov | 3 | | 4 | chein | 2 | | 4 | petrov | 1 | | 7 | popov | 2 | | 7 | sidopov | 1 | |--------------------------------| т.е. два наибольших элемента переместились в конец списка (значит до этого момента всё работает верно), а при перемещении третьего наибольшего элемента получается вся ерунда. Т.е. иными словами, когда один из замещаемых элементов является началом списка. Цитата:
------------------------------------------------------------------------------------------------------------ Цитата:
last->next->prior -- это указатель prior этого следующего за last элемента, т.е. last->next->prior=list; указатель prior следующего за last элемента, теперь будет указывать на тот же участок памяти, что и list. |
Перестановка двух элементов списка получилась.
Код:
for(last=begin;last->next!=NULL;){ |
Время: 12:13. |
Время: 12:13.
© OSzone.net 2001-