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

Односвязный линейный список - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.69
Nadin_
0 / 0 / 0
Регистрация: 12.01.2011
Сообщений: 13
16.06.2011, 13:45     Односвязный линейный список #1
Текст помощи для не которой программы организован в виде линейного списка
Каждая компонента текста помощи содержит термин (слово) и текст,содержащий пояснение к этому термину.

Написать программу,которая обеспечивает
- начальное формирование текста помощи;
- вывод текста помощи;
- вывод поясняющего текста для заданного термина
Программа должна обеспечить диалог с помощью меню и контроль ошибок при вводе.

у меня есть она...но новый элемент она вставляет в начало списка,а нужно в конец.

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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <iostream.h>
struct list{
    char name[100];
    char text[100];
    struct list *next;
    };
 
typedef struct list BASE;
typedef BASE *pr;
 
 
void spisok_dobavit (pr *ptr);
void spisok_print   (pr*, int kolichestvo);
void spisok_poisk   (pr*);
 
 
int proverka(pr);
 
 
void main(void)
{
 int tmp_key;
 clrscr();
 
 
           int kolichestvo=0;
           pr sptr = NULL;
           int tmp_key2;
           clrscr();
 
 
           do
         {
         clrscr();
         fflush(stdin);
 
         printf("     (1) dobavit.\n");
         printf("     (2) show.\n");
         printf("     (3) poisk.\n");
         printf("     (4) Exit.\n");
 
         switch(getch()){
 
             case '1':
 
                 {
                 clrscr();
 
                 printf("vvedite termin: \n");
                 kolichestvo++;
                 spisok_dobavit(&sptr);
                 }
             break;
 
 
             case '2':
 
                 {
 
 
 
                 clrscr();
 
                 if(proverka(sptr)){
                  printf("Error:Spisok pyst ! \n ");
 
                // printf("„«п Їа®¤®«¦Ґ*Ёп **¦¬ЁвҐ «оЎго Є«*ўЁиг");
                 getch();
                 }
 
                 else
                 spisok_print(&sptr,kolichestvo);
                 }
 
             break;
 
             case '3':
 
                 {
                 clrscr();
 
                 if(proverka(sptr)){
                  printf("Ћ&#152;?ЃЉЂ: ‹Ёбв Їгбв! \n ");
                 getch();
                 }
 
                 else
                 spisok_poisk(&sptr);
                 }
 
             break;
 
             case '4':
 
                 {
 
                 tmp_key2='Y';
                 }
             break;
 
             default :
 
                 {
                  printf("Ћ&#152;?ЃЉЂ: vvedite(1-5)! \n ");
                  getch();
                 }
             }
         }
 
           while(tmp_key2!='Y');
 
 
           }
 
 
void spisok_dobavit(pr *ptr)
{
 pr r;
 r=(BASE*)malloc(sizeof(BASE));
 r->next=NULL;
 
 printf("\n -  : ");
 scanf("%s",r->name);
 
 printf("\n - Termin: ");
 scanf("%s",r->text);
 
 
 
 r->next= *ptr;
 *ptr = r;
 /*pr r;
 cin>>r->name;
 cin>>r->text;
 r->next=new BASE;
 r=r->next;
            */
}
 
 
 
 
void spisok_print(pr *ptr, int kolichestvo)
{
 printf("             baza: \n");
 pr r;
 r=*ptr;
 //r=r->next;
 printf("%-5s%-15s%-13s%\n","No.","Termin","Text");
 
 do
   {
   printf("%-5d%-15s%-13s%\n",kolichestvo,r->name,r->text);
   kolichestvo--;
   r=r->next;
   }
 
 while(r != NULL);
 getch();
 free(r);
}
 
 
void spisok_poisk(pr *ptr)
{
 char name[100];
 int poisk;
 
 pr q,p;
 q=*ptr;
 
 printf("\n - Vvedite termin ");
 scanf("%s",&name);
 
 while(q!=NULL && poisk){
     poisk=strcmp(name,q->name);
     p=q;
     q=q->next;
     }
 
 if(poisk!=0){
     printf("\n Sorry no elem \n");
 
     getch();
     }
 
 else{
     q=p;
     printf("%-5s%-15s%-13s%-12s%-10s\n","No.","termin","Text");
     printf("%-5d%-15s%-13s%-12s%-10d\n",1,q->name,q->text);
     getch();
     }
 poisk=1;
}
 
 
 
 
int proverka(pr topptr)
{
 return topptr == NULL;
}
Помогите переделать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.06.2011, 13:45     Односвязный линейный список
Посмотрите здесь:

C++ Линейный односвязный список
Односвязный линейный список C++
список линейный односвязный C++
Односвязный линейный список C++
Линейный односвязный список C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ruu
13 / 13 / 1
Регистрация: 20.07.2010
Сообщений: 43
16.06.2011, 13:49     Односвязный линейный список #2
Цитата Сообщение от Nadin_ Посмотреть сообщение
у меня есть она...но новый элемент она вставляет в начало списка,а нужно в конец.
Если реализацию односвязного списка дам, тебе этого хватит чтобы дальше самому доделать?
З.Ы. Вчера только занимался изучением и реализацией списков))
Nadin_
0 / 0 / 0
Регистрация: 12.01.2011
Сообщений: 13
16.06.2011, 13:54  [ТС]     Односвязный линейный список #3
Ну давай,попытаюсь переделать,хотя что только я не делала уже.
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
16.06.2011, 13:59     Односвязный линейный список #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void spisok_dobavit(pr **ptr)
{
 pr * r,r_2,r_3;
 r=(BASE*)malloc(sizeof(BASE));
 r->next = NULL; 
 printf("\n -  : ");
 scanf("%s",r->name);
 
 printf("\n - Termin: ");
 scanf("%s",r->text); 
r_2 = (*ptr);
while(r_2)
{
r_3 = r_2;
r_2 = r_3 -> next;
}
r_3->next = r;
}
Цитата Сообщение от Nadin_ Посмотреть сообщение
pr r;
*r=(BASE*)malloc(sizeof(BASE));
статической нельзя выделить память.!!!
Ruu
13 / 13 / 1
Регистрация: 20.07.2010
Сообщений: 43
16.06.2011, 14:05     Односвязный линейный список #5
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#include <stdio.h>
#include <stdlib.h>
 
struct node {
    struct node * next;
    int data;
};
struct list {
    struct node * head;
};
 
void push_front(struct list *l, int value){
    struct node * node;
    
    node = (struct node*)malloc(sizeof(*node));
    
    if(l->head != NULL){
        node->next = l->head;
        l->head = node;
    }
    else{
        l->head = node;
    }
    l->head->data = value;
}
void push_back(struct list *l, int value){
    struct node * node;
    struct node * tail;
    
    node = (struct node*)malloc(sizeof(*node));
    
    if(l->head != NULL){
        tail = l->head;
        while(tail->next != NULL)
            tail = tail->next;
        tail->next = node;
        node->next = NULL;
        node->data = value;
    }
    else{
        node->data = value;
        l->head = node;
    }
}
 
void pop_front(struct list *l){
    struct node * node;
    
    if(l->head != NULL){
        node = l->head;
        l->head = node->next;
        free(node);
    }
}
void pop_back(struct list *l){
    struct node * prev;
    struct node * tail;
    
    if(l->head != NULL){
        prev = l->head;
        tail = l->head;
        while(tail->next != NULL){
            prev = tail;
            tail = tail->next;
        }
        if(l->head->next == NULL){
            l->head = NULL;
            free(l->head);
            return;
        }
        prev->next = NULL;
        free(tail);
    }
}
int front(struct list *l){
 
    if(l->head != NULL){
        return l->head->data;
    }
    else{
        return 0;
    }   
}
int back(struct list *l){
    struct node * prev;
    struct node * tail;
    
    if(l->head != NULL){
        tail = l->head;
        while(tail->next != NULL){
            prev = tail;
            tail = tail->next;
        }
        return tail->data;
    }
    else{
        return 0;
    }   
}
 
void insert(struct list *l, int position, int value){
    struct node *cur;
    struct node * newnode;
    struct node * node;
    int i=0;
    
    newnode = (struct node*)malloc(sizeof(*node));
 
    if(l->head != NULL && position > 0){
        cur = l->head;
        node = l->head;
        for(i=0;i<(position-1);++i,cur = cur->next,node = node->next);
        node = node->next;
        newnode->next = node;
        cur->next = newnode;
        
    }
    else{
        newnode->next = l->head;
        l->head = newnode;
    }
    newnode->data = value;
}
void erase(struct list *l, int position){
    struct node *cur;
    struct node * node;
    struct node * prev;
    int i=0;
    
    if(l->head == NULL) return;
    if(l->head != NULL && position > 1){
        cur = l->head;
        prev = l->head;
        for(i=0;i<(position-2);++i,cur = cur->next,prev = prev->next);
        prev = prev->next;
        node = prev->next;
        free(prev);
        cur->next = node;
    }
    else{
        prev = l->head;
        l->head = l->head->next;
        free(prev);
    }
}
void exchange(struct list *l, int first_elem, int second_elem){
    struct node * prev_first = NULL;
    struct node * prev_second =NULL;
    struct node * first = NULL;
    struct node * second = NULL;
    struct node * after_first = NULL;
    struct node * after_second = NULL;
    int i=0;
    
    if(l->head == NULL || l->head->next == NULL) return;
    if(l->head != NULL && first_elem > 0 && second_elem > 0){
        prev_first = l->head;
        for(i=0;i<(first_elem-2);++i,prev_first = prev_first->next);
        first = prev_first->next;
        after_first = first->next;
        
        prev_second = l->head;
        for(i=0;i<(second_elem-2);++i,prev_second = prev_second->next);
        second = prev_second->next;
        after_second = second->next;
        if(first_elem > 1) {
            first->next = after_second;
            prev_first->next = second;      
        }
        else {
            after_first = first;
            first = prev_first;
            first->next = after_second;
            l->head = second;
        }
        if(second_elem-first_elem > 1 || first_elem-second_elem > 1) {
            prev_second->next = first;
            second->next = after_first;
        }
        else
            second->next = first;       
    }
    else{
 
    }
    
}
 
int main() {
    struct list l;
    int i;
    
    for(i=0;i<12;++i)
        push_front(&l, i+1);
    for(i=0;i<12;++i){
        //printf("%d ", back(&l));
        //pop_back(&l);
    }
    printf("\n");
    //insert(&l,3,1);
    //erase(&l,12);
    exchange(&l,1,2);
    for(i=0;i<19;++i){
        printf("%d ", back(&l));
        pop_back(&l);
    }
    return 0;
}
В main() примеры пользования списком) Я его тестировал так)) Не фонтан конечно тесты но помоему и так понятно как юзать функции)

З.Ы. тут реализованы функции:
"положить в начало списка", "положить в конец списка", "достать из начала списка", "достать из конца списка", "Удалить улез из начала списка", "удалить узел из конца списка", "Вставка в любое место списка", "удаление любого элемента списка", "Поменять элементы местами"
Nadin_
0 / 0 / 0
Регистрация: 12.01.2011
Сообщений: 13
16.06.2011, 15:16  [ТС]     Односвязный линейный список #6
Выдает ошибку
в 5 строчке

Добавлено через 12 минут
Цитата Сообщение от Aneron Посмотреть сообщение
статической нельзя выделить память.!!!
а как??

Добавлено через 56 минут
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <string.h>
#include <iostream.h>
struct list{
    char name[100];
    char text[100];
    struct list *next;
    };
 
typedef struct list BASE;
typedef BASE *pr;
 
 
void spisok_dobavit (pr *ptr);
void spisok_print   (pr*, int kolichestvo);
void spisok_poisk   (pr*);
 
 
int proverka(pr);
 
 
void main(void)
{
 int tmp_key;
 clrscr();
 
 
           int kolichestvo=0;
           pr sptr = NULL;
           int tmp_key2;
           clrscr();
 
 
           do
         {
         clrscr();
         fflush(stdin);
 
         printf("     (1) dobavit.\n");
         printf("     (2) show.\n");
         printf("     (3) poisk.\n");
         printf("     (4) Exit.\n");
 
         switch(getch()){
 
             case '1':
 
                 {
                 clrscr();
 
                 printf("vvedite termin: \n");
                 kolichestvo++;
                 spisok_dobavit(&sptr);
                 }
             break;
 
 
             case '2':
 
                 {
 
 
 
                 clrscr();
 
                 if(proverka(sptr)){
                  printf("Error:Spisok pyst ! \n ");
 
                // printf("„«п Їа®¤®«¦Ґ*Ёп **¦¬ЁвҐ «оЎго Є«*ўЁиг");
                 getch();
                 }
 
                 else
                 spisok_print(&sptr,kolichestvo);
                 }
 
             break;
 
             case '3':
 
                 {
                 clrscr();
 
                 if(proverka(sptr)){
                  printf("Ћ&#152;?ЃЉЂ: ‹Ёбв Їгбв! \n ");
                 getch();
                 }
 
                 else
                 spisok_poisk(&sptr);
                 }
 
             break;
 
             case '4':
 
                 {
 
                 tmp_key2='Y';
                 }
             break;
 
             default :
 
                 {
                  printf("Ћ&#152;?ЃЉЂ: vvedite(1-5)! \n ");
                  getch();
                 }
             }
         }
 
           while(tmp_key2!='Y');
 
 
           }
 
void spisok_dobavit(pr *ptr)
{
 pr r,r_2,r_3;
 r=(BASE*)malloc(sizeof(BASE));
 r->next = NULL; 
 printf("\n -  : ");
 scanf("%s",r->name);
 
 printf("\n - Termin: ");
 scanf("%s",r->text); 
 
*ptr=r_2;
while(r_2)
{
r_3 = r_2;
r_2 = r_3 -> next;
}
r_3->next = r;
}
 
 
 
 
void spisok_print(pr *ptr, int kolichestvo)
{
 printf("             baza: \n");
 pr r;
 r=*ptr;
 
 printf("%-5s%-15s%-13s\n","No.","Termin","Text");
 
 do
   {
   printf("%-5d%-15s%-13s\n",kolichestvo,r->name,r->text);
   kolichestvo--;
   r=r->next;
   }
 
 while(r != NULL);
 getch();
 free(r);
}
 
 
void spisok_poisk(pr *ptr)
{
 char name[100];
 int poisk;
 
 pr q,p;
 q=*ptr;
 
 printf("\n - Vvedite termin ");
 scanf("%s",&name);
 
 while(q!=NULL && poisk){
     poisk=strcmp(name,q->name);
     p=q;
     q=q->next;
     }
 
 if(poisk!=0){
     printf("\n Sorry no elem \n");
 
     getch();
     }
 
 else{
     q=p;
     printf("%-5s%-15s%-13s%-12s%-10s\n","No.","termin","Text");
     printf("%-5d%-15s%-13s%-12s%-10d\n",1,q->name,q->text);
     getch();
     }
 poisk=1;
}
 
 
 
 
int proverka(pr topptr)
{
 return topptr == NULL;
}
Выводит мусор перед информацией.Что не так?
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
16.06.2011, 15:29     Односвязный линейный список #7
Считать данные из файла в динамический массив соответствующего типа
20 пост. изучайте.
Nadin_
0 / 0 / 0
Регистрация: 12.01.2011
Сообщений: 13
16.06.2011, 22:39  [ТС]     Односвязный линейный список #8
Люди,ничего не получается,видает мусор да и еще пищит,я уже не могу запуталась окончательно. Помогите!!!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2011, 21:50     Односвязный линейный список
Еще ссылки по теме:

C++ Линейный односвязный список
Односвязный линейный список C++
Линейный односвязный список C++

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
17.06.2011, 21:50     Односвязный линейный список #9
Например вот так.
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct ValueType {
  char *description;
  char *word;
} ValueType;
 
typedef struct Node {
  struct Node *next;
  ValueType value;
} Node;
 
typedef struct List {
  Node *first;
} List;
 
Node* NodeNew(const char *word, const char *description, Node *next) {
  Node *result = (Node*)malloc(sizeof(Node));
  result->next = next;
  result->value.description =
    strcpy((char*)malloc(strlen(description) + 1), description);
  result->value.word =
    strcpy((char*)malloc(strlen(word) + 1), word);
  return result;
}
 
void NodeDelete(Node *node) {
  free(node->value.description);
  free(node->value.word);
  free(node);
}
 
void ListNew(List *list) {
  list->first = NULL;
}
 
int ListIsEmpty(List *list) {
  return (list->first == NULL);
}
 
Node* ListLastNode(List *list) {
  Node* result = list->first;
  while (result != NULL && result->next != NULL)
    result = result->next;
  return result;
}
 
void ListPushBack(List *list, const char *word, const char *description) {
  Node *node = NodeNew(word, description, NULL);
  if (ListIsEmpty(list)) {
    list->first = node;
  } else {
    Node *last_node = ListLastNode(list);
    last_node->next = node;
  }
}
 
int ListSize(List *list) {
  int result = 0;
  Node *node = list->first;
  while (node != NULL) {
    node = node->next;
    ++result;
  }
  return result;
}
 
void ListPrint(List *list) {
  Node *node = list->first;
  while (node != NULL) {
    printf("%s: %s\n", node->value.word, node->value.description);
    node = node->next;
  }
}
 
const char *ListFindByWord(List *list, const char *word) {
  static const char not_found[] = "No help text availiable.";
  Node *node = list->first;
  while (node != NULL) {
    if (strcmp(node->value.word, word) == 0)
      return node->value.description;
    node = node->next;
  }
  return not_found;
}
 
void ListDelete(List *list) {
  while (!ListIsEmpty(list)) {
    Node *next = list->first->next;
    NodeDelete(list->first);
    list->first = next;
  }
}
 
int main(int argc, char *argv[]) {
  // объявление списка
  List list;
  // инициализация списка
  ListNew(&list);
  // добавление элементов
  ListPushBack(&list, "Cow", "Large animal.");
  ListPushBack(&list, "Cat", "Small adorable pet.");
  ListPushBack(&list, "Chair", "A furniture, used for sitting on.");
  // размер списка
  printf("List contains %d element(s):\n", ListSize(&list));
  // вывод списка на экран
  ListPrint(&list);
  // поиск элемента по списку (поиск по слову, возвращает описание)
  printf("Help for 'Cat': %s\n", ListFindByWord(&list, "Cat"));
  printf("Help for 'Wolf': %s\n", ListFindByWord(&list, "Wolf"));
  // удаление списка
  ListDelete(&list);
  return 0;
}
Yandex
Объявления
17.06.2011, 21:50     Односвязный линейный список
Ответ Создать тему
Опции темы

Текущее время: 13:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru