1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
1

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

08.03.2013, 19:30. Показов 1928. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2013, 19:30
Ответы с готовыми решениями:

Линейные однонаправленные списки
Здравствуйте всем, помогите, не могу решить задачу: дописать в список(head) после первого вхождения...

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

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

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

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

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

Добавлено через 3 минуты
Troll1, я первый раз вижу такой список... сделайте все по-человечески, создайте функции добавления, удаления, поиска... и с ними работайте, я не увидел ни одной осмысленной строчки
0
4049 / 3303 / 923
Регистрация: 25.03.2012
Сообщений: 12,396
Записей в блоге: 1
08.03.2013, 21:02 3
Цитата Сообщение от Troll1 Посмотреть сообщение
strcpy(pstud->name, lpstud[i].name);
что такое pstud в этой строчке?
0
381 / 352 / 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
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
381 / 352 / 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
4049 / 3303 / 923
Регистрация: 25.03.2012
Сообщений: 12,396
Записей в блоге: 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
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:27 8
Kuzia domovenok, может, не знаю)) это я для примера написал
0
1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:30  [ТС] 9
Спасибо ребят Если вдруг у вас сохранились какие-нибудь примеры с линейными списками, был бы признателен, если бы вы их покидали) В интернете об этом очень мало написано, т.к. в теории эта тема весьма понятна
0
73 / 73 / 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.e... oglav.html
0
381 / 352 / 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
1 / 1 / 2
Регистрация: 23.09.2012
Сообщений: 91
08.03.2013, 21:39  [ТС] 12
yoghurt92 спасибо Это я так понял, как должно быть в идеале, по науке, в теории. Здорово!)
0
381 / 352 / 113
Регистрация: 17.05.2012
Сообщений: 1,049
08.03.2013, 21:43 13
Troll1, да не за что, сам учусь но лучше взять мой пример за основу и сделать правильно

Добавлено через 1 минуту
Troll1, если что, обращайтесь
0
4049 / 3303 / 923
Регистрация: 25.03.2012
Сообщений: 12,396
Записей в блоге: 1
08.03.2013, 21:50 14
Цитата Сообщение от The_bolT Посмотреть сообщение
по идее Ptr -> next должен указывать на следующий элемент а не на голову, не так ли?
так я у себя в голову вставляю новый элемент! Это значит, что next нового элемента указывает на мою старую голову, а затем значение указателя изменяется, указывая на вставленный в голову элемент.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2013, 21:50
Помогаю со студенческими работами здесь

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

Односвязные линейные списки
Здравствуйте! Есть данная функция чтения данных и занесения их в создаваемый список struct LIST {...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru