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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
#1

Линейные списки - C++

08.03.2013, 19:30. Просмотров 1180. Ответов 13
Метки нет (Все метки)

Ребят, подскажите в чем ошибка Компилятор не находит, а при запуске вылетает. Я подозреваю, что проблема с памятью... Искал информацию в литературе, но там про списки написано мало. Вот мой код, может кому-нибудь удастся объяснить, в чем я не прав
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
#include <stdio.h>
#include <string.h>
 
typedef struct stud
    {
        char name[70];
        char phone[30];
        stud* pNext;
    }STUD;
    static STUD lpstud[7]=
    {
        {"Ruslan_Ruslanov", "4346211", NULL},
        {"Nikita_Nikitin", "4656218", NULL},
        {"Elizaveta_Ivanova", "4376342", NULL},
        {"Daniil_Pavlov", "4376640", NULL},
        {"Anna_Sergeeva", "5825581", NULL},
        {"Alexey_Bozhko", "6285518", NULL},
        {"Elena_Petrova", "4362988", NULL}
    };
 
    STUD* pstud = NULL; 
    STUD* pTail   = pstud;
 
    #define __countof(ptr) sizeof(ptr) / sizeof(ptr[0]) \
 
int main()
{
 
    for (int i = 0;i != __countof(lpstud); i++)
    {
       STUD* pstudItem = new STUD;
        strcpy(pstud->name, lpstud[i].name);
        strcpy(pstud->phone, lpstud[i].phone);
        pstudItem->pNext = NULL;
        if (pstud == NULL)  
        { 
            pstud = pstudItem; pTail = pstud;
        }
        else
        { 
            pTail->pNext = pstudItem; pTail = pstudItem;
        }
    }
 
    for (; pstud != NULL; pstud = pstud->pNext)
       printf("%s %s\n",pstud->name, pstud->phone);
    
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 19:30     Линейные списки
Посмотрите здесь:

Односвязные линейные списки - C++
Доброго времени суток. Передо мной стоит задача написание программы, которая принимает два списка, вводимых с клавиатуры и проверяет их на...

однонаправленые линейные списки - C++
много смотрел в инете, но ничего путного так и не нашел, в чем отличие списка от структур как их задавать, как сортировать, может есть...

Односвязные линейные списки - C++
Помогите пожалуйста с задачей со списками, т.к вообще не могу в них разобраться. Задача такая: даны текстовый файл и натуральное число n....

Задача на линейные списки - C++
Задание : в файловой системе каталог файлов организован как линейный список. Для каждого файла в каталоге содержатся следующие сведения :...

Односвязные линейные списки - C++
Здравствуйте! Помогите пожалуйста. Даны текстовый файл и строка s. Группы символов, разделенные пробелами, будем называть ...

Линейные Односвязные Списки С++ - C++
Разработать и реализовать программу создания и обработки линейного односвязного списка с одним информационным полем, которое содержит целое...

Линейные двусвязные списки - C++
Проверьте пожалуйста. 1.Дан список. Найти указатель на его последний элемент. template&lt;typename T&gt; node&lt;T&gt; * FindLastElem(node&lt;T&gt;...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 20:51     Линейные списки #2
Troll1, объясните мне вот эту строчку

C++
1
strcpy(pstud->name, lpstud[i].name);
кстати в ней и выскакивает ошибка

Добавлено через 3 минуты
Troll1, я первый раз вижу такой список... сделайте все по-человечески, создайте функции добавления, удаления, поиска... и с ними работайте, я не увидел ни одной осмысленной строчки
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
08.03.2013, 21:02     Линейные списки #3
Цитата Сообщение от Troll1 Посмотреть сообщение
strcpy(pstud->name, lpstud[i].name);
что такое pstud в этой строчке?
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:11     Линейные списки #4
Kuzia domovenok, вот это что STUD* pstud = NULL;

Добавлено через 3 минуты
Troll1, вот вам список, добавьте его в программу и работайте с ним

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
#include "stdafx.h"
#include <iostream>
#include <locale.h>
using namespace std;
 
struct List
{
    int data;
    List *next;
};
 
class ListNode
{
    private:
        List *Head;
 
    public:
        ListNode()
        {
            Head = NULL;
        }
 
        void addFromBack(int val)
        {
            List *Ptr = new List;
            Ptr -> data = val;
            Ptr -> next = NULL;
 
            if(Head == NULL)
            {
                Head = Ptr;
                Ptr -> next = NULL;
            }
            else
            {
                List *temp = Head;
                while(temp -> next != NULL)
                    temp = temp -> next;
 
                temp -> next = Ptr;
            }
        }
 
        void show()
        {
            List *Ptr = Head;
            while(Ptr != NULL)
            {
                cout << Ptr -> data << " ";
                Ptr = Ptr -> next;
            }
        }
};
 
int main()
{
    ListNode a;
    a.addFromBack(1);
    a.addFromBack(2);
    a.addFromBack(3);
    a.addFromBack(4);
 
    a.show();
 
    cout << "\n\n";
    return 0;
}
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:18  [ТС]     Линейные списки #5
Мне нужно было создать список структур и вывести на экран, что я и пытался сделать.
Суть этой строчки такова: strcpy(pstud->name, lpstud[i].name);
я хотел вывести на экран все имена из структуры.
Я понимаю, что в теории должно выглядеть примерно так: strcpy(pstud->name, "Ruslan Ruslanov"), но так как у меня несколько имен, я это пытался сделать в цикле

Добавлено через 2 минуты
yoghurt92 спасибо, буду пробовать
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:23     Линейные списки #6
Troll1, тогда выделите память под них...

C++
1
2
STUD* pstud = new STUD; 
    STUD* pTail   = new STUD;
Добавлено через 3 минуты
Troll1, так все выводит:

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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
typedef struct stud
    {
        char name[70];
        char phone[30];
        stud* pNext;
    }STUD;
    static STUD lpstud[7]=
    {
        {"Ruslan_Ruslanov", "4346211", NULL},
        {"Nikita_Nikitin", "4656218", NULL},
        {"Elizaveta_Ivanova", "4376342", NULL},
        {"Daniil_Pavlov", "4376640", NULL},
        {"Anna_Sergeeva", "5825581", NULL},
        {"Alexey_Bozhko", "6285518", NULL},
        {"Elena_Petrova", "4362988", NULL}
    };
 
    STUD* pstud = new STUD; 
    STUD* pTail = new STUD;
 
    #define __countof(ptr) sizeof(ptr) / sizeof(ptr[0]) \
 
int main()
{
 
    for (int i = 0;i != __countof(lpstud); i++)
    {
       STUD* pstudItem = new STUD;
 
       strcpy(pstud -> name, lpstud[i].name);
       strcpy(pstud->phone, lpstud[i].phone);
       pstudItem->pNext = NULL;
 
        if (pstud == NULL)  
        { 
            pstud = pstudItem; pTail = pstud;
        }
        else
        { 
            pTail->pNext = pstudItem; pTail = pstudItem;
        }
 
        printf("%s %s\n",pstud->name, pstud->phone);
    }
 
    //for (; pstud != NULL; pstud = pstud->pNext)
       
    
    return 0;
}
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
08.03.2013, 21:24     Линейные списки #7
Цитата Сообщение от yoghurt92 Посмотреть сообщение
void addFromBack
А почему, собственно, from back?
Сколько видел примеров односвязных списков. Похоже авторы не понимают, что самое естесственное для односвязного списка добавление элементов это в начало.
Непонятно, почему все стремятся добавлять в конец. Наверное ещё какие-то аналогии с массивами действуют.
C++
1
2
3
4
5
6
void addFront(int val){
  List *Ptr = new List;
  Ptr -> data = val;
  Ptr -> next = head;
  head=Ptr;
}
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:27     Линейные списки #8
Kuzia domovenok, может, не знаю)) это я для примера написал
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:30  [ТС]     Линейные списки #9
Спасибо ребят Если вдруг у вас сохранились какие-нибудь примеры с линейными списками, был бы признателен, если бы вы их покидали) В интернете об этом очень мало написано, т.к. в теории эта тема весьма понятна
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
08.03.2013, 21:32     Линейные списки #10
Kuzia domovenok, у меня есть один вопрос:
C++
1
2
3
4
5
6
void addFront(int val){
  List *Ptr = new List;//создали новую ячейку
  Ptr -> data = val; //занесли туда элемент
  Ptr -> next = head;//по идее Ptr -> next должен указывать на следующий элемент а не на голову, не так ли?
  head=Ptr;
}
Добавлено через 1 минуту
Вот здесь хорошо росписано о списках.
http://khpi-iip.mipk.kharkiv.edu/lib...gsu/oglav.html
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:34     Линейные списки #11
Troll1, вот так ваша программа будет выводить что вы хотели

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
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
typedef struct stud
    {
        char name[70];
        char phone[30];
        stud* pNext;
    }STUD;
    static STUD lpstud[7]=
    {
        {"Ruslan_Ruslanov", "4346211", NULL},
        {"Nikita_Nikitin", "4656218", NULL},
        {"Elizaveta_Ivanova", "4376342", NULL},
        {"Daniil_Pavlov", "4376640", NULL},
        {"Anna_Sergeeva", "5825581", NULL},
        {"Alexey_Bozhko", "6285518", NULL},
        {"Elena_Petrova", "4362988", NULL}
    };
 
    STUD* Head = NULL;
 
    #define __countof(ptr) sizeof(ptr) / sizeof(ptr[0]) \
 
int main()
{
 
    for (int i = 0;i != __countof(lpstud); i++)
    {
       STUD* pstudItem = new STUD;
 
       strcpy(pstudItem -> name, lpstud[i].name);
       strcpy(pstudItem -> phone, lpstud[i].phone);
 
        if (Head == NULL)  
        { 
            Head = pstudItem;
             pstudItem->pNext = NULL;
        }
        else
        { 
            STUD* pstud = Head; 
            while(pstud ->pNext != NULL)
                pstud = pstud ->pNext;
 
            pstud ->pNext = pstudItem;
             pstudItem->pNext = NULL;
        }
    }   
 
    STUD* pstud1 = Head; 
    while(pstud1 != NULL)
    {
       printf("%s %s\n",pstud1->name, pstud1->phone);
       pstud1 = pstud1 ->pNext;
    }
    
    return 0;
}
Troll1
1 / 1 / 1
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:39  [ТС]     Линейные списки #12
yoghurt92 спасибо Это я так понял, как должно быть в идеале, по науке, в теории. Здорово!)
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:43     Линейные списки #13
Troll1, да не за что, сам учусь но лучше взять мой пример за основу и сделать правильно

Добавлено через 1 минуту
Troll1, если что, обращайтесь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 21:50     Линейные списки
Еще ссылки по теме:

Односвязные линейные списки - C++
Подскажите пожалуйста, как заменить содержимое файла перечнем символов, которые в нем встречаются, упорядоченным в порядке убывания...

Динамические структуры: линейные списки - C++
Люди помогите:wall: Дали задачу из учебника Павловской Вот вроде смотрю как в учебнике написано про линейные списки все понятно. Как...

Стек, очередь (линейные списки) - C++
Привет! Мне нужно поместить четные элементы стека в динамический массив, затем вывести содержимое этого массива и поместить элементы стека...

Линейные односвязные списки. Вставка элемента - C++
Добрый день! Никогда не была в ладах со списками, поэтому очень нужна помощь! как сделать Дублирование первого элемента после заданного...

Проверка на существование элемента по ключу. Линейные списки - C++
Собственно вроде все работает, только не получается сделать, чтобы при добавлении нового элемента делалась проверка по номеру, к примеру...


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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
08.03.2013, 21:50     Линейные списки #14
Цитата Сообщение от The_bolT Посмотреть сообщение
по идее Ptr -> next должен указывать на следующий элемент а не на голову, не так ли?
так я у себя в голову вставляю новый элемент! Это значит, что next нового элемента указывает на мою старую голову, а затем значение указателя изменяется, указывая на вставленный в голову элемент.
Yandex
Объявления
08.03.2013, 21:50     Линейные списки
Ответ Создать тему
Опции темы

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