Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите с задачей


Автор: rujmaster 30.4.2009, 21:25
Дана задача. Разработать двусвязный список, функцию добавления элемента в начало и ф-ию удаления любого элемента из списка. С удалением, как я понял, нужно рассмотреть 3 случая: элемент в начале, в конце и где-то в списке). Для демонстрации всех 3 случаев решил сделать возможность вводить самому нужную строку для удаления.
Код


#include <stdio.h>
#include <stdlib.h>
struct group {
        int nacelenie;
        char punkt[25];
        struct group * next;
        struct group * prev;
    };

    struct group *a;
    struct group *b;
    struct group *c;
    struct group *head = NULL;
    struct group *tmp;
    int i, tmp1=0;
    char tmp2[20];


struct group * insertHead(struct group* head_ptr,struct group* tmp_ptr){
    if (head_ptr==NULL && tmp_ptr!=NULL)
        return tmp_ptr;
    head_ptr->prev=tmp_ptr;
    tmp_ptr->next=head_ptr;
    return tmp_ptr;
}


struct group * del (struct group * str) {
    if (str->prev==NULL) {
        head=str->next;
        str->next=NULL;
        head->prev=NULL;
        free (str);
    }
    else {
        if (str->next==NULL) {
            c=str->prev; 
            str->prev=NULL;
            c->next=NULL;
            free (str);
        }
        else {
            a=str->prev;
            b=str->next;
            b->prev=str->prev;
            a->next=str->next;
            str->next=str->prev=NULL;
            free (str);
        }
    }
    return str;
}









int main() {
    
    
    
    for(i=0;i<5; i++){
        tmp = (struct group*) malloc(sizeof(struct group));
        scanf("%d %s", &tmp->nacelenie, tmp->punkt);
        tmp->next=tmp->prev=NULL;
        head = insertHead(head,tmp);
    }
    tmp=head;
    printf("\n");


    while (tmp!=NULL){
        printf("%d %s\n", tmp->nacelenie, tmp->punkt);
        tmp=tmp->next;
    } 
    tmp=head;

    printf ("\n");

    scanf ("%d %s", &tmp1, &tmp2);
    while (tmp!=NULL) {
    if (tmp1==tmp->nacelenie && tmp2==tmp->punkt) {
        break;
    } 
    tmp=tmp->next;
    }
    del (tmp);

    
    
    


    


    tmp=head;
    printf("\n");
    printf("\n");
    while (tmp!=NULL){
        printf("%d %s\n", tmp->nacelenie, tmp->punkt);
        tmp=tmp->next;
    } 
    
    return 0;
}
 

Программа вываливается с ошибкой.  Проблема где-то тут:
Код

scanf ("%d %s", &tmp1, &tmp2);
    while (tmp!=NULL) {
    if (tmp1==tmp->nacelenie && tmp2==tmp->punkt) {
        break;
    } 
    tmp=tmp->next;
    }
    del (tmp);

ибо сама функция работает нормально. Помогите разобраться smile

Автор: bsa 1.5.2009, 18:24
для начала вспомни, как надо сравнивать строки.

Автор: stat007 2.5.2009, 12:03
это легко делается с помощью функции erase().

Автор: zim22 2.5.2009, 14:37
Цитата(stat007 @  2.5.2009,  12:03 Найти цитируемый пост)
это легко делается с помощью функции erase().

и где же вы увидели функцию erase в коде rujmaster?

Автор: andrew_121 2.5.2009, 14:51
Цитата(zim22 @  2.5.2009,  14:37 Найти цитируемый пост)
и где же вы увидели функцию erase в коде rujmaster? 

И я не нашел... smile 

Автор: azesmcar 2.5.2009, 23:24
Цитата(bsa @  1.5.2009,  18:24 Найти цитируемый пост)
для начала вспомни, как надо сравнивать строки. 


Цитата(stat007 @  2.5.2009,  12:03 Найти цитируемый пост)
это легко делается с помощью функции erase(). 

 smile  smile  smile 

Автор: bsa 2.5.2009, 23:26
azesmcar, да да. меня тоже порадовало

Автор: azesmcar 2.5.2009, 23:29
rujmaster

Такого вида сравнения заменить на strcmp
Код

tmp1==tmp->nacelenie 

А вылетает конкретно тут
Код

del (tmp);

после
Код

tmp=tmp->next;

в переменной tmp оказывается значение 0 (NULL) и функция del вылетает.
видимо ошибка в логике, проверьте логику работы программы

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)