Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
salamandr244
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 4
1

Однонаправленный список

10.04.2017, 15:57. Просмотров 505. Ответов 5
Метки нет (Все метки)

Вообщем по заданию, мне надо перед указателем поместить элемент, то-есть, если мы имеем список 1 2 *3 4 5, где * указатель на текущий элемент, то после того как я вставил для примера 666, у меня должен получится воот такой уже список 1 2 *666 3 4 5 Ниже приведен когд, когда указатель указывает на первый элемент, тоесть я переприсваиваю самый первый элмент, на котрый у меня всегда остается указатель

C
1
2
3
4
5
6
7
temp = (struct list*)malloc(sizeof(list));
temp->value= n;
temp->next=lst;
lst=temp;
pr=lst;
printf("0.Введен %d елемент \n",n);
n++;
Ниже приведен когд, который работает, когда я сместил один раз указатель вправо, тоесть не изменяю "голову" списка

C
1
2
3
4
5
6
7
temp = (struct list*)malloc(sizeof(list));
temp->value = n;
temp->next=pr;
pr = temp;
printf("1.Введен %d елемент \n",n);
n++;
break;
Где pr - это указатель коорый я двигаю с помощью
C
1
2
pr=pr->next;
printf("Указатель смещен в право!\n");
и код с помощью которого я все вывожу

C
1
2
for(sp=lst;sp!=NULL;sp=sp->next){
printf("%d ", sp->value);
Проблема в том, что когда указатель указывает на голову, то все вставляется нормально, но как только я сдвинул указатель вправо, то он вроде бы добавляет, но уже не выводит. не подскажите, в чем проблема.


Весь код ниже, подскажите пожалуйста(
Кликните здесь для просмотра всего текста
/*
============================================================================
Name : Lab71.c
Author :
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/

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

const UINT MEMORY_SIZE = 120 * 1024;

typedef struct list {
int value;
struct Node *next;
} list;

list *lst, *pr;
int j;

void printLinkedList(const list *head) {
while (head != NULL) {
printf("%d ", head->value);
head = head->next;
}
printf("\n");
}

int main(void) {
int menu, n;
n = 1;
setlocale(LC_ALL, "Rus");

int e[1000];
HANDLE CurrentProcessHeap = GetProcessHeap();

list *temp, *p, *root, *sp;

printf("0.Проверить, список пуст или не пуст\n");
printf("1.добавить элемент\n");
printf("2.Вывести все элементы\n");
printf("22.Вывести элемент за указателем\n");
printf("3.Перевести элемен в начало списка\n");
printf("4.Перевести указатель вправо\n");
printf("5.Добавить элементы\n");
printf("6.Удалить элементы\n");
while (menu != -1) {
scanf("%d", &menu);
switch (menu) {
case 0: {
if (lst == NULL) {
printf("Список пуст\n");
}

else {
printf("список не пуст!\n");
}
break;

}
case 1: {
if (lst == NULL) {
e[0] = HeapAlloc(CurrentProcessHeap, 0, MEMORY_SIZE);
lst = (struct list*) malloc(sizeof(struct list));
lst->value = 0;
lst->next = NULL;
pr = lst;
printf("Главный(первый) элемент введен! \n");
j = 1;
break;
}
if (lst != NULL) {
if (j != 1) {
e[n] = HeapAlloc(CurrentProcessHeap, 0, MEMORY_SIZE);
temp = (struct list*) malloc(sizeof(list));
temp->value = n;
temp->next = pr;
pr = temp;
printf("1.Введен %d елемент \n", n);
n++;
break;
}
if (j == 1) {
e[n] = HeapAlloc(CurrentProcessHeap, 0, MEMORY_SIZE);
temp = (struct list*) malloc(sizeof(list));
temp->value = n;
temp->next = lst;
lst = temp;
pr = lst;
printf("0.Введен %d елемент \n", n);
n++;
break;
}

}

}
case 2: {
sp = lst;

//printLinkedList(lst);
//printLinkedList(pr);
printLinkedList(sp);
/*for(sp=pr;sp!=NULL;sp=sp->next){
printf("%d ", sp->value); // вывод значения элемента p

}
printf("\n");*/
break;
}
case 22: {
printf("%d ", pr->value); // вывод значения элемента p
printf("\n");
break;
}
case 3: {
pr = lst;
j = 1;
break;
}
case 4: {

pr = pr->next;
printf("Указатель смещен в право!\n");
j = 0;
break;
}
case 5: {

break;
}
case 6: {
list *del;
del = pr;
pr = pr->next;
free(del);
del = NULL;
break;

}
}
}

}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2017, 15:57
Ответы с готовыми решениями:

Кольцевой однонаправленный список
Задача: создать элемент-структуру {ФИО, Должность, место проживания} и...

Кольцевой однонаправленный список
Как реализовать функцию вывода элементов кольцевого однонаправленного списка?...

Реализовать однонаправленный список
Ребята помогите нужно реализовать однонаправленный список. Необходимо...

Реализовать однонаправленный список
Плиз срочно помогите,нужно до завтра сделать задание(((ибо не поставят...

Необходимо отсортировать однонаправленный список.
Необходимо создать однонаправленный список и реализовать в нём все...

5
palva
3165 / 2281 / 466
Регистрация: 08.06.2007
Сообщений: 8,250
Записей в блоге: 4
10.04.2017, 16:15 2
Проблема в том, что, вы не сменили указатель-next в предыдущем элементе списка, который после вставки должен указывать на temp. Но поскольку у вас список однонаправленный, то вы и не можете выйти на предыдущий элемент списка, пользуясь только указателем pr. Вам придется искать этот элемент последовательным прохождением элементов списка, начиная с головы.
2
salamandr244
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 4
10.04.2017, 16:20  [ТС] 3
А можете наглядна показать, а то я с этими указателями и списками по тихонечку начинаю сходить с ума... Буду очень рад и благодарен если объясните на примере
0
shvyrevvg
724 / 540 / 270
Регистрация: 12.05.2016
Сообщений: 1,571
10.04.2017, 16:31 4
Цитата Сообщение от salamandr244 Посмотреть сообщение
Проблема в том, что когда указатель указывает на голову, то все вставляется нормально, но как только я сдвинул указатель вправо, то он вроде бы добавляет, но уже не выводит. не подскажите, в чем проблема.
salamandr244, не вижу чтобы предыдущему элементу next устанавливали на текущий при добавлении. Вы же pr присвоили новый указатель, а у элемента перед next на что будет указывать?

Добавлено через 32 секунды

Не по теме:

Опоздал. Забыл отправить сразу :D



Добавлено через 2 минуты
Если будете передвигаться только вправо. Что мешает добавить еще один указатель, который присваивать перед
C
1
2
prpr= pr;
pr = pr->next;
1
salamandr244
0 / 0 / 0
Регистрация: 08.09.2015
Сообщений: 4
10.04.2017, 16:41  [ТС] 5
Цитата Сообщение от shvyrevvg Посмотреть сообщение
Если будете передвигаться только вправо. Что мешает добавить еще один указатель, который присваивать перед
CВыделить код
1
2
prpr= pr;
pr = pr->next;
А можете на моем примере показать, куда вставить, и с большими поясненями, а то я запутался во всем это, если не сложно конечно)
0
palva
3165 / 2281 / 466
Регистрация: 08.06.2007
Сообщений: 8,250
Записей в блоге: 4
10.04.2017, 16:41 6
Что значит наглядно? Нарисовать что ли? Ну вот, вы вставили. Элемент A должен указывать на Temp, а он по-прежнему указывает на B. Проблема в том, чтобы найти элемент A. Наверно, при выработке pr вы использовали указатель на A. Надо было его сохранить и использовать при обработке pr. Если вы получили pr не путем копирования указателя из A, тогда думайте, что делать. То ли переделывать список на двунаправленный, то ли использовать ресурсозатратный алгоритм движения от головы списка.
1
Миниатюры
Однонаправленный список  
10.04.2017, 16:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2017, 16:41

Добавление элемента в однонаправленный список
Итак, задача: написать мини-программку, которая создает однонаправленный список...

Реализовать однонаправленный список с барьерным элементом
Нужно реализовать однонаправленный список с барьерным элементом.Один из пунктов...

Запись действительных чисел из файла в линейный однонаправленный список
помогите написать код на запись действительных чисел из файла в линейный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru