1

私は次のコードを持っています:

#include <stdio.h>
#include <stdlib.h>
#define MAXN 100
typedef int key;
typedef int data;
struct list * createElement(key k, data info);

struct list{
    key k;
    data info;
    struct list *next;
};
struct list *L;
void init(key k, data info)
{
    L = createElement(k, info);
}
struct list * createElement(key k, data info)
{
    struct list *temp;
    temp = (struct list *) malloc(sizeof(*temp));
    temp->k = k;
    temp->info = info;
    return temp;
}
void insert(struct list * element)
{
    element->next = L;
    L = element;
}
void insertBefore(struct list * element, key k)
{
    struct list * currentElement = L;
    while(currentElement != NULL)
    {
        if(currentElement->k == k)
        {
            struct list *temp = currentElement;
            currentElement = element;
            currentElement->next = temp;
            return;
        }
        currentElement = currentElement->next;
    }

}
void insertAfter(struct list * element, key k)
{
    struct list * currentElement = L;
    while(currentElement != NULL)
    {
        if(currentElement->k == k)
        {
            struct list *temp = currentElement->next;
            currentElement->next = element;
            element->next = temp;
            return;
        }
        currentElement = currentElement->next;
    }
}
void deleteElement(struct list * element)
{
    struct list * currentElement = L;
    while(currentElement != NULL)
    {
        if(currentElement == element)
        {
            struct list * temp = currentElement;
            currentElement = currentElement->next;
            free(temp);
            return;
        }
        currentElement = currentElement->next;
    }
}
struct list * getElementByKey(key k) {
    printf("\n1");
    struct list *currentElement = L;
    printf("2");
    while(currentElement != NULL)
    {
        printf("3");
        if(currentElement->k == k)
        {
            printf("4");
            return currentElement;
        }
        printf("5");
        currentElement = currentElement->next;
        printf("6");
    }
    printf("There is no such element in the list");
}
struct list * pop()
{
    struct list *element = L;
    L = L->next;
    return element;
}
int main()
{
    init(0, 13);
    struct list * element = createElement(5, 155);
    insert(element);
    struct list * k = createElement(7, 243);
    insert(k);
    //insertBefore(createElement(3, 100), 5);
    printf("The first element value is: %d", pop()->info);
    printf("The second element value is: %d", pop()->info);
    printf("The  element value is: %d", getElementByKey(5)->info);

    return 0;
}

そのため、デバッガーを実行すると、if(currentElement->k == k)getElementByKey メソッドにある 84 行目でセグマンテーション違反が発生します。存在しない要素にアクセスしようとしていることはわかっていますが (pop メソッドを使用すると、リストの最初の要素が削除されるため)、警告メッセージが表示されます。前の要素のキーに問題があるか、気付きにくかったようです。

4

3 に答える 3

3

関数で、ポインターを NULLcreateElementに初期化するのを忘れました。next

struct list * createElement(key k, data info)
{
    struct list *temp;
    temp = (struct list *) malloc(sizeof(*temp));
    temp->k = k;
    temp->info = info;
    temp->next = NULL;
    return temp;
}

そのため、リストを参照しているときに、次のポインターが NULL に等しくならないため、リストの最後の要素を見つけることができず、メモリ内のランダムな位置に移動し、許可されていない部分にアクセスしようとします。

于 2013-04-06T13:13:20.503 に答える
1

要素を ( を使用して) 削除すると、deleteElement()を再初期化できませんL


セグメンテーション違反は、無効なメモリ アドレスif(currentElement->k == k)を参照している可能性が高いためです。84 行目より前のいくつかの行currentElementに対してかどうかをテストすると、無効なアドレスが明示的に割り当てられているか、それが指すアドレスが既に解放されている場合にのみ可能性があります。NULLcurrentElement

に示されているコードから、 deleteElement()後者を想定しています。

于 2013-04-06T12:51:37.447 に答える
1

二つの問題

1) createElement() で

必要

temp->next = NULL;

2) insertBefore() で

リストのポインタを変更しない

currentElement = element;

例えば)

void insertBefore(struct list * element, key k)
{
    struct list * currentElement = L; //add case of L->k
    while(currentElement != NULL)
    {
        if(currentElement->next && currentElement->next->k == k)
        {
            element->next = currentElement->next;
            currentElement->next = element;
            return;
        }
        currentElement = currentElement->next;
    }
}
于 2013-04-06T13:18:57.887 に答える