Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
#1

Добавление, вставка и удаления элемента структуры - C (СИ)

01.02.2012, 14:10. Просмотров 2759. Ответов 27
Метки нет (Все метки)

добавить операции добавление, вставка и удаления элемента с интерактивного меню

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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define STR_LEN 64
typedef struct str
{
    char name[STR_LEN];
    char exp[STR_LEN];
    unsigned long size;
    int day;
    int mon;
    int year;
} str_t;
 
int name_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_c(const void * a, const void * b){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_c(const void * a, const void * b){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_c(const void * a, const void * b){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_c(const void * a, const void * b){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_c(const void * a, const void * b){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
int name_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->name, ((str_t*)b)->name);
}
 
int exp_d(const void * b, const void * a){
    return strcmp(((str_t*)a)->exp, ((str_t*)b)->exp);
}
 
int size_d(const void * b, const void * a){
    return ((str_t*)a)->size - ((str_t*)b)->size;
}
 
int day_d(const void * b, const void * a){
    return ((str_t*)a)->day - ((str_t*)b)->day;
}
 
int mon_d(const void * b, const void * a){
    return ((str_t*)a)->mon - ((str_t*)b)->mon;
}
 
int year_d(const void * b, const void * a){
    return ((str_t*)a)->year - ((str_t*)b)->year;
}
 
void show(const str_t * arr, size_t cnt){
        printf("Name               Exp          Size       Date \n");
    while ( cnt-- ){
        printf("%-20s%-5s%10u%10i%5i.%i.%i\n", arr->name, arr->exp, arr->size, arr->day, arr->mon, arr->year);
        ++arr;
    }
}
 
#define NUM_FILES 4
 
int main(void)
{
    str_t a[NUM_FILES];
    int i,s;
    int j=0;
 
    for(i=0; i < NUM_FILES; i++)
    {
    printf("file #%i\n", i+1);
    printf("enter name: ");
    scanf("%s", &a[i].name);
    printf("enter expansion: ");
    scanf("%s", &a[i].exp);
    printf("enter size: ");
    scanf("%lu", &a[i].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[i].day);
    printf("enter month:");
    scanf("%i", &a[i].mon);
    printf("enter year:");
    scanf("%i", &a[i].year);
    }
    printf("\n Unsorted \n");
    show(a, NUM_FILES);
    printf("\n Choose function:\n ");
    printf("\n 1. To sort by name.\n ");
    printf("\n 2. To sort by expansion. \n ");
    printf("\n 3. To sort by size. \n ");
    printf("\n 4. To sort by date. \n ");
    printf("\n 5. To sort by name (rev).\n ");
    printf("\n 6. To sort by expansion (rev). \n ");
    printf("\n 7. To sort by size (rev). \n ");
    printf("\n 8. To sort by date (rev). \n ");
    printf("\n 9. To show common size. \n ");
    printf("\n 0. To close. \n ");
    do
    {
    scanf("%i", &s);
    switch(s)
    {
    case 1:
    printf("\n Sorted by name: \n");
    qsort(a, NUM_FILES, sizeof(str_t), name_c);
    show(a, NUM_FILES);
    break;
    case 2:
    printf("\n Sorted by expansion: \n");
    qsort(a, NUM_FILES, sizeof(str_t), exp_c);
    show(a, NUM_FILES);
    break;
    case 3:
    printf("\n Sorted by size: \n");
    qsort(a, NUM_FILES, sizeof(str_t), size_c);
    show(a, NUM_FILES);
    break;
    case 4:
    printf("\n Sorted by date: \n");
    qsort(a, NUM_FILES, sizeof(str_t), day_c);
    qsort(a, NUM_FILES, sizeof(str_t), mon_c);
    qsort(a, NUM_FILES, sizeof(str_t), year_c);
    show(a, NUM_FILES);
    break;
    case 5:
    printf("\n Sorted by name (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), name_d);
    show(a, NUM_FILES);
    break;
    case 6:
    printf("\n Sorted by expansion (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), exp_d);
    show(a, NUM_FILES);
    break;
    case 7:
    printf("\n Sorted by size (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), size_d);
    show(a, NUM_FILES);
    break;
    case 8:
    printf("\n Sorted by date (reverse): \n");
    qsort(a, NUM_FILES, sizeof(str_t), day_d);
    qsort(a, NUM_FILES, sizeof(str_t), mon_d);
    qsort(a, NUM_FILES, sizeof(str_t), year_d);
    show(a, NUM_FILES);
    break;
    case 9:
    for(i=0; i < NUM_FILES; i++)
    j=j+a[i].size;
    printf("common size %i",j);
    case 0:
    break;
    }
    }while(s != 0);
    
        getch();
        return 0;
}
Добавлено через 2 часа 31 минуту
вот попытка добавления, но ругается на NUM_FILES=NUM_FILES+1;

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case 10:
    NUM_FILES=NUM_FILES+1;
    printf("file #%i\n", NUM_FILES);
    printf("enter name: ");
    scanf("%s", &a[NUM_FILES].name);
    printf("enter expansion: ");
    scanf("%s", &a[NUM_FILES].exp);
    printf("enter size: ");
    scanf("%lu", &a[NUM_FILES].size);
    printf("date: ");
    printf("enter day:");
    scanf("%i", &a[NUM_FILES].day);
    printf("enter month:");
    scanf("%i", &a[NUM_FILES].mon);
    printf("enter year:");
    scanf("%i", &a[NUM_FILES].year);
    break;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2012, 14:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Добавление, вставка и удаления элемента структуры (C (СИ)):

Функция удаления элемента структуры
Здравствуйте, в этой функции может удаляться любой элемент, кроме первого, как...

Функция удаления элемента структуры
Здравствуйте, не могли бы подсказать, где я ошибся?( функция никак не хочет...

Структуры: добавление в бинарное дерево нового элемента
У меня возникло непонимание, как работают структуры. Ниже пример кода...

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

Функция удаления структуры из бинарного файла
Привет всем, кто смотрит эту тему :) Если не сложно, если интересно, помогите...

Добавление элемента после элемента с заданным ключом в однонаправленном списке
Здравствуйте! У меня неправильно работает функция insert, которая должна...

27
Том Ардер
Модератор
Эксперт по математике/физике
3819 / 2431 / 327
Регистрация: 15.06.2009
Сообщений: 4,442
07.02.2012, 13:01 #21
Цитата Сообщение от adelok Посмотреть сообщение
printf("enter position to paste:");
d++;
scanf("%i",&m);
for(i=d-1; i > m; i--)
Нечётко. Если здесь m - номер позиции (1, 2, ...), на которую нужно вставить элемент, то соответствующий индекс m - 1 (0, 1, ...). И заголовок цикла надо так:
C
1
for(i=d-1; i >= m - 1; i--)
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
07.02.2012, 19:39  [ТС] #22
а если ругается на name и exp(видимо потому что они char) Lvalue required, что сделать?
0
Том Ардер
Модератор
Эксперт по математике/физике
3819 / 2431 / 327
Регистрация: 15.06.2009
Сообщений: 4,442
07.02.2012, 20:03 #23
Цитата Сообщение от adelok Посмотреть сообщение
a[i+1].name=a[i].name;
a[i+1].exp=a[i].exp;


В левой части оператора = массивы запрещены. (Lvalue !)
C
1
2
strcpy( a[i+1].name, a[i].name );
strcpy( a[i+1].exp, a[i].exp );
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
07.02.2012, 21:01  [ТС] #24
а удаление как сделать?обнулить элементы номера и в конец массива кинуть?
0
Том Ардер
Модератор
Эксперт по математике/физике
3819 / 2431 / 327
Регистрация: 15.06.2009
Сообщений: 4,442
07.02.2012, 23:40 #25
Цитата Сообщение от adelok Посмотреть сообщение
а удаление как сделать?
Аналогично вставке, только сдвиг части массива в другую сторону, потом уменьшить размер массива на 1

Добавлено через 16 минут
Если m - номер элемента, который надо удалить, то так:

C
1
2
3
4
5
for( i = m-1; i < d; i++ )
{
  a[i] = a[i+1]; /* это расписать подробно */
}
d--;
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
08.02.2012, 17:55  [ТС] #26
удаление

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
case 12:
    printf("\n enter position to delete:");
    scanf("%i",m);
    for( i = m-1; i < d; i++ )
    {
    a[i].num=a[i+1].num;
    strcpy( a[i].name, a[i+1].name );
    strcpy( a[i].exp, a[i+1].exp );
    a[i].size=a[i+1].size;
    a[i].day=a[i+1].day;
    a[i].mon=a[i+1].mon;
    a[i].year=a[i+1].year;
    }
    d--;
    show(a,d);
    break;
компилируется, но иногда зацикливается. проверьте, всё верно?

Добавлено через 50 минут
иногда до show вылетает
0
Том Ардер
Модератор
Эксперт по математике/физике
3819 / 2431 / 327
Регистрация: 15.06.2009
Сообщений: 4,442
08.02.2012, 18:05 #27
Цитата Сообщение от adelok Посмотреть сообщение
for( i = m-1; i < d; i++ )
Да, здесь у меня ошибка. Поскольку d - размер массива, то индекс последнего элемента = d - 1. Заголовок цикла так ( i + 1 < d, зн. i < d - 1) :

C
1
for( i = m-1; i < d - 1; i++ )
1
adelok
1 / 1 / 1
Регистрация: 23.12.2010
Сообщений: 136
08.02.2012, 18:22  [ТС] #28
плюс ещё в scanf импеданс забыл.всё спс работает
0
08.02.2012, 18:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2012, 18:22
Привет! Вот еще темы с решениями:

Разобрать код удаления элемента списка
есть структура: struct Book{ char title; char author; short pages;...

Процедура удаления элемента из списка выдает ошибку
Процедура удаления элемента из списка, в первой же строке ошибка ...

Вставка элемента в список
Здравствуйте.Пишу код #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include...

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


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

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

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