Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Troll1
1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
1

Линейные списки

08.03.2013, 19:30. Просмотров 1292. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2013, 19:30
Ответы с готовыми решениями:

Линейные двусвязные списки
Проверьте пожалуйста. 1.Дан список. Найти указатель на его последний элемент....

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

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

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

однонаправленые линейные списки
много смотрел в инете, но ничего путного так и не нашел, в чем отличие списка...

13
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 20:51 2
Troll1, объясните мне вот эту строчку

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

Добавлено через 3 минуты
Troll1, я первый раз вижу такой список... сделайте все по-человечески, создайте функции добавления, удаления, поиска... и с ними работайте, я не увидел ни одной осмысленной строчки
0
Kuzia domovenok
2337 / 2079 / 487
Регистрация: 25.03.2012
Сообщений: 7,432
Записей в блоге: 1
08.03.2013, 21:02 3
Цитата Сообщение от Troll1 Посмотреть сообщение
strcpy(pstud->name, lpstud[i].name);
что такое pstud в этой строчке?
0
yoghurt92
375 / 346 / 113
Регистрация: 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;
}
0
Troll1
1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:18  [ТС] 5
Мне нужно было создать список структур и вывести на экран, что я и пытался сделать.
Суть этой строчки такова: strcpy(pstud->name, lpstud[i].name);
я хотел вывести на экран все имена из структуры.
Я понимаю, что в теории должно выглядеть примерно так: strcpy(pstud->name, "Ruslan Ruslanov"), но так как у меня несколько имен, я это пытался сделать в цикле

Добавлено через 2 минуты
yoghurt92 спасибо, буду пробовать
0
yoghurt92
375 / 346 / 113
Регистрация: 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;
}
0
Kuzia domovenok
2337 / 2079 / 487
Регистрация: 25.03.2012
Сообщений: 7,432
Записей в блоге: 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;
}
0
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:27 8
Kuzia domovenok, может, не знаю)) это я для примера написал
0
Troll1
1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:30  [ТС] 9
Спасибо ребят Если вдруг у вас сохранились какие-нибудь примеры с линейными списками, был бы признателен, если бы вы их покидали) В интернете об этом очень мало написано, т.к. в теории эта тема весьма понятна
0
The_bolT
70 / 70 / 12
Регистрация: 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
0
yoghurt92
375 / 346 / 113
Регистрация: 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;
}
0
Troll1
1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:39  [ТС] 12
yoghurt92 спасибо Это я так понял, как должно быть в идеале, по науке, в теории. Здорово!)
0
yoghurt92
375 / 346 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:43 13
Troll1, да не за что, сам учусь но лучше взять мой пример за основу и сделать правильно

Добавлено через 1 минуту
Troll1, если что, обращайтесь
0
Kuzia domovenok
2337 / 2079 / 487
Регистрация: 25.03.2012
Сообщений: 7,432
Записей в блоге: 1
08.03.2013, 21:50 14
Цитата Сообщение от The_bolT Посмотреть сообщение
по идее Ptr -> next должен указывать на следующий элемент а не на голову, не так ли?
так я у себя в голову вставляю новый элемент! Это значит, что next нового элемента указывает на мою старую голову, а затем значение указателя изменяется, указывая на вставленный в голову элемент.
0
08.03.2013, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.03.2013, 21:50

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

Односвязные линейные списки
Помогите пожалуйста с задачей со списками, т.к вообще не могу в них...

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


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

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

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