0

初めてでも問題なく動作します。項目を追加して表示機能で表示できます。しかし、2 番目の値を追加しようとすると、fgets で「a」を押すとすぐにセグ フォールトが発生します。一番上でコメントアウトしました。

(Add 以外の機能はまだ試していません。)

#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <ctype.h>
#include    "sortedll.h"

int     main(void)
{

int             intVal;
LNode           *headPtr = NULL;
char            buf[BUFLEN];
int             result;

do  {
    // ask the user what they want to do
    DisplayMenu();
    printf("Please enter a selection: ");
    fgets(buf, BUFLEN, stdin);
    *buf = toupper(*buf);
    switch (*buf)
        {
        case   'A':
            // prompt the user for a value; if we get one, add it to the
            // list
            printf("Please enter an integer value to add: ");
            fgets(buf, BUFLEN, stdin);

            //=======================================================================
            printf("check"); //doesn't print this second time around. seg fault at fgets?
            //=======================================================================

            if (1 != sscanf(buf, "%d", &intVal))
                {
                puts("Error reading the integer value...");
                }
            else
                {
                printf("1");
                headPtr = AddItem(headPtr, intVal);
                }
            break;

        case   'R':
            // if the list is empty display a message; else, get a value
            // from the user and attempt to remove it from the list
            if (NULL == headPtr)
                {
                puts("The list is currently empty...");
                }
            else
                {
                printf("Please enter an integer value to remove: ");
                fgets(buf, BUFLEN, stdin);
                if (1 != sscanf(buf, "%d", &intVal))
                    {
                    puts("Error reading the integer value...");
                    }
                else
                    {
                    headPtr = RemoveItem(headPtr, intVal);
                    }
                }
            break;

        case   'D':
            // display the current contents of the list
            result = DisplayList(headPtr);
            printf("Currently there %s %d node%s in the list.\n"
                                , (result != 1) ? "are" : "is"
                                , result
                                , (result != 1) ? "s" : "");
            break;

        case   'Q':
            // release all allocated memory and set the head pointer to
            // NULL to indicate that it is empty
            result = ReleaseMemory(headPtr);
            printf("There %s %d node%s released."
                                , (result != 1) ? "were" : "was"
                                , result
                                , (result != 1) ? "s" : "");
            headPtr = NULL;
            break;

        default:
            puts("Unrecognized option; please try again.");
            break;
        }
    puts(" ");

    } while ('Q' != *buf);

puts("Thanks for playing!  Bye!!\n");
return  0;

}  // end of "main"



// ==== AddItem ===============================================================


LNode*  AddItem(LNode  *headPtr, int  newItem)
{
    LNode *node = malloc(sizeof(*node));
    node->value = newItem;


    if(headPtr == NULL)
        {
        node->next = NULL;
        return node;
        }

    LNode *leadPtr = headPtr;
    LNode *trailPtr = headPtr;

    while(leadPtr->value != newItem)
        {
        leadPtr = leadPtr->next;
        trailPtr = leadPtr;
        }    

    leadPtr = leadPtr->next;
    free(trailPtr->next);    
    trailPtr->next = node;
    node->next = leadPtr;

    return headPtr;

}  // end of "AddItem"



// ==== DisplayList ===========================================================


int     DisplayList(LNode  *nodePtr)
{
    auto    int         counter = 0;

    // if the list is empty, indicate as such and return zero
    if (NULL == nodePtr)
        {
        puts("The list is currently empty...");
        return (0);
        }

    while (NULL != nodePtr)
        {
        printf("%d\n", nodePtr->value);
        nodePtr = nodePtr->next;
        counter++;
        }

    return (counter);

}  // end of "DisplayList"



// ==== DisplayMenu ===========================================================


void    DisplayMenu(void)
{
    puts("A)dd a value");
    puts("R)emove a value");
    puts("D)isplay the list");
    puts("Q)uit");

}  // end of "DisplayMenu"



// ==== ReleaseMemory =========================================================


int     ReleaseMemory(LNode  *headPtr)
{


}  // end of "ReleaseMemory"



// ==== RemoveItem ============================================================


LNode*  RemoveItem(LNode  *headPtr, int  targetItem)
{


}  // end of "RemoveItem"
4

2 に答える 2

0

そして、malloc 呼び出しからの戻り値を確認する必要があります。

LNode *node = malloc(sizeof(*node));

node->value = newItem;

ヒープ領域が不足した場合はどうなりますか?

于 2012-11-08T16:29:42.307 に答える
0

LeadPtr が NULL の可能性がある場合に、ここで leadPtr->value にアクセスしようとしているようです。

while(leadPtr->value != newItem)
    {
    leadPtr = leadPtr->next;
    trailPtr = leadPtr;
    }

そのメンバーにアクセスする前に、leadPtr != NULL であることを確認する必要があります。

コード スニペットが属している関数をリファクタリングすることをお勧めします。メモリ アクセスの点で少し脆弱に見えます。

于 2012-11-08T15:54:04.400 に答える