Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sSTUDENTUSs
-10 / 1 / 0
Регистрация: 05.10.2014
Сообщений: 26
#1

Теряется указатель на начало односвязного списка - C++

24.02.2016, 09:32. Просмотров 145. Ответов 0
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream>
#include <ctype.h>
 
typedef struct Node {
    struct Node* next;
    int value;
} Node;
typedef struct List {
    struct Node* head;
    int count;
} List;
 
List* CreateList() {
    List* list = (List*)malloc(sizeof(List));
    list->head = NULL;
    list->count = 0;
    return list;
}
 
 
void push(List** list, int data) {
    Node *tmp = (Node*)malloc(sizeof(Node));
    tmp->value = data;
    tmp->next = (*list)->head;
    (*list)->head = tmp;
    (*list)->count++;
}
 
 
int pop(List** list) {
    Node* prev = NULL;
    int val;
    if (((*list)->head) == NULL) {
        exit(-1);
    }
    prev = ((*list)->head);
    val = prev->value;
    ((*list)->head) = ((*list)->head)->next;
    free(prev);
    (*list)->count--;
    return val;
}
 
 
Node* getNth(List** list, int n) {
    int counter = 0;
    while (counter < n && (*list)->head) {
        (*list)->head = (*list)->head->next;
        counter++;
    }
    return (*list)->head;
}
 
 
void insert(List* list, unsigned n, int val) {
    unsigned i = 0;
    Node *tmp = NULL;
    while (i < n && list->head->next) {
        list->head = list->head->next;
        i++;
    }
    tmp = (Node*)malloc(sizeof(Node));
    tmp->value = val;
    if (list->head->next) {
        tmp->next = list->head->next;
    }
    else {
        tmp->next = NULL;
    }
    list->head->next = tmp;
    list->count++;
}
 
 
int deleteNth(List** list, int n) {
    if (n == 0) {
        return pop(&*list);
    }
    else {
        Node* prev = getNth(&*list, n - 1);
        Node* elm = prev->next;
        int val = elm->value;
 
        prev->next = elm->next;
        free(elm);
        return val;
    }
    (*list)->count--;
}
 
 
void deleteList(List** list) {
    while ((*list)->head->next) {
        pop(&*list);
        (*list)->head = (*list)->head->next;
    }
    free((*list)->head);
    (*list)-> count = 0;
}
 
 
void fromArray(List** list, int *arr, int size) {
    int i = size - 1;
    if (arr == NULL || size == 0) {
        return;
    }
    do {
        push(list, arr[i]);
    } while (i-- != 0);
}
 
 
void printLinkedList(List* list) {
    Node* tmp = list->head;
    while (tmp) {
        printf("%d ", tmp->value);
        tmp= tmp->next;
    }
    printf("\n");
}
 
 
int main(void) {
    List* list=CreateList();
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    fromArray(&list, arr, 10);
    printLinkedList(list);
 
    printf("nodes number %d\n", list->count);
 
    push(&list, 100);
    push(&list, 101);
    push(&list, 102); 
    push(&list, 103);
    push(&list, 104);
    push(&list, 105);
    
    printLinkedList(list);
 
    insert(list, 4, 1000);
    printLinkedList(list);
 
    deleteNth(&list, 3);
 
    printLinkedList(list);
    getchar();
}
собственно, при выполнении программы у меня список выводится не полностью, то есть куда то теряется указатель на начало списка... Вот и пытаюсь понять что не так, может поможете, плюсану
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2016, 09:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Теряется указатель на начало односвязного списка (C++):

Вставка элемента в начало односвязного списка - C++
Помогите вставить элемент в начало односвязного списка. Написана функция Insert, но она работает только для вставки в середину и конец...

Добавление элемента в начало односвязного списка - C++
Здравствуйте, я не где не могу найти функцию по добавлению элемента в начало односвязного списка. Пожалуйста подскажите ее.

Получить указатель на элемент двунаправленного списка, добавить значение в начало списка и очистить его - C++
Нужно создать двунаправленный список //вроде так, но не уверен struct Double_List {//структура данных int Data;...

Удалить из списка все элементы с нечётными значениями и вывести указатель p2 на начало преобразованного списка. - C++
Здравствуйте. Не получается решить задачу. Условие. Дан непустой двусвязный список. Удалить из списка все элементы с нечётными ...

Теряется указатель на переменые в классе - C++
образован двусвязный список. Данные находятся в трех перменныех, посел поступления данных в функцию sAge указатели на перменные типа char...

Удаление элементов из односвязного списка списка - C++
Привет всем знатокам, суровым программистам и профессионалам своего дела. Засел за реализацией списка и что то пока не могу понять. Задача...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2016, 09:32
Привет! Вот еще темы с ответами:

Сортировка односвязного списка - C++
Добрый день форумчанам! Есть задача но не знаю как написать ее так как не знаю динамического программирования ) Будьте любезны...

Из односвязного списка в двусвязный - C++
Помогите, кусок переделать в двусвязный список. #include &lt;iostream&gt; using namespace std; struct Node { int data; ...

Вывод односвязного списка на C - C++
помогите исправить ошибку!не выводит последний элемент списка. пишет: В экземпляре объекта не задана ссылка на объект. вот листинг...

Вывод односвязного списка - C++
Выводи лишь последний элемент, в чёи ошибка? Подскажите пожалуйста #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; ...


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

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

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