2017-06-06 72 views
-1

我對編碼相當陌生,並且正在學習一門教授C編程語言的課程。我們正在學習C語言中的數據結構,並且已經完成了一項任務,它要求我們創建一個從1到10的奇數整數的鏈表,並打印該列表。但是,我寫的代碼似乎有一些問題。那就是:創建一個奇數的鏈接列表(C)

#include <stdio.h> 
#include <stdlib.h> 

struct listNode { 
    int value; 
    struct listNode *nextPtr; 
}; 

typedef struct listNode ListNode; 
typedef ListNode *ListNodePtr; 

void createList(ListNodePtr *sPtr); 
void printList(ListNodePtr currentPtr); 

int main(void) { 
    ListNodePtr list1Ptr; 

    list1Ptr = NULL; 

    list1Ptr->value = 1; 
    createList(&list1Ptr); 
    printf("List 1 is: "); 
    printList(list1Ptr); 

    printf("End of run.\n"); 

    return 0; 
} 

void createList(ListNodePtr *sPtr) { 
    ListNodePtr previousPtr; 
    ListNodePtr newPtr; 

    newPtr = malloc(sizeof(ListNodePtr)); 

    if (newPtr != NULL) { 
     newPtr = *sPtr; 

     previousPtr = NULL; 

     while (((*sPtr)->value) <= 10) { 
      previousPtr = *sPtr; 
      *sPtr = (*sPtr)->nextPtr; 
      (*sPtr)->value = previousPtr->value + 2; 
     } 
    } 
    else { 
     printf("No memory available.\n"); 
    } 
} 

int isEmpty(ListNodePtr sPtr) { 
    return sPtr == NULL; 
} 

void printList(ListNodePtr currentPtr) { 
    if (currentPtr == NULL) { 
     printf("List is empty.\n\n"); 
    } 
    else { 
     while (currentPtr != NULL) { 
      printf("%d ", currentPtr->value); 
      currentPtr = currentPtr->nextPtr; 
     } 
     printf("*\n"); 
    } 
} 

所需的輸出是:(表1)爲:1 3 5 7 9 *] 我使用的環境不斷告訴我,有兩種「未處理的異常」(我不那麼確定這意味着什麼)或者只是中途停止運行。有關我如何能夠達到預期結果的任何想法?

任何其他的建議和建議的話是非常感謝。謝謝!

+0

第一個問題是:list1Ptr = NULL; list1Ptr-> value = 1;您正試圖分配給未分配的內存。在調試器中執行代碼... –

+0

指針只保存地址,因此您需要先分配內存並取消分配內存。請參閱malloc和free函數C –

+5

題外話,我會告訴你一些與你的教師可能做的事情相反的事情:*不要在typedefs *中隱藏指針類型。有一個非常小的,有限數量的情況下,它是真正意義的(基於黑盒手柄的API,回調函數指針類型是我們想到的兩個)。對於其他所有情況,它會使代碼更難以閱讀,並且過分傾向於「大小錯誤」。 C程序員*希望*看到這些星號。它們就像是一個告示牌,告訴讀者:「這是一個指針。」所以不管你的教授說什麼,打破這個習慣。 – WhozCraig

回答

1

在邏輯上以及使用pointers幾乎沒有錯誤。可能是下面的代碼有用。註釋如果需要任何澄清:

#include <stdio.h> 
#include <stdlib.h> 
#define START_COUNT 1 
#define INCREMENT_COUNT 2 
#define END_COUNT 10 


struct listNode { 
    int value; 
    struct listNode *nextPtr; 
}; 

typedef struct listNode ListNode; 
typedef ListNode* ListNodePtr; 

ListNodePtr createList(ListNodePtr sPtr, int val); 
void printList(ListNodePtr currentPtr); 

int main(void) { 
    ListNodePtr list1Ptr; 
    int counter = END_COUNT; 

    list1Ptr = NULL; 
    do 
    { 
     list1Ptr = createList(list1Ptr, START_COUNT); 
     counter -= INCREMENT_COUNT; 
    }while(counter>0); 
    printf("List 1 is: "); 
    printList(list1Ptr); 

    printf("End of run.\n"); 

    return 0; 
} 

ListNodePtr createList(ListNodePtr sPtr, int val) { 
    ListNodePtr previousPtr; 
    ListNodePtr newPtr; 
    newPtr = malloc(sizeof(ListNode)); 

    if (newPtr != NULL) { 

     //Make 'newPtr' very first node 
     newPtr->nextPtr =sPtr; 
     newPtr->value = val; 

     sPtr = newPtr; 
     //(sPtr != NULL) is to check for [1] and (sPtr->nextPtr != NULL) for [2] 
     while ((sPtr != NULL) && (sPtr->nextPtr != NULL) && (sPtr->value <= END_COUNT)) { 
      previousPtr = sPtr; //[1] 
      sPtr = sPtr->nextPtr; //[2] 
      sPtr->value = previousPtr->value + INCREMENT_COUNT; //[1] and [2] 
     } 
    } 
    else { 
     printf("No memory available.\n"); 
    } 

    //Set to the very first Node 
    return newPtr; 
} 

int isEmpty(ListNodePtr sPtr) { 
    return sPtr == NULL; 
} 

void printList(ListNodePtr currentPtr) { 
    if (currentPtr == NULL) { 
     printf("List is empty.\n\n"); 
    } 
    else { 
     while (currentPtr != NULL) { 
      printf("%d ", currentPtr->value); 
      currentPtr = currentPtr->nextPtr; 
     } 
     printf("*\n"); 
    } 
} 
0
while (((*sPtr)->value) <= 10) { <<<<< 
    previousPtr = *sPtr; 
    *sPtr = (*sPtr)->nextPtr; 
    (*sPtr)->value = previousPtr->value + 2; <<<<< 
} 

您必須檢查(*sPtr)NULL,試圖取消引用它。

0

恕我直言,這樣的構造功能最直觀的界面

  • 使用函數參數的參數提供給構造
  • 使用返回將生成的項目傳遞給呼叫者的值

struct listNode *listNode_generate(int start, int stop, int step) 
{ 
struct listNode *result, **pp; 

if (!step) return NULL; 

result = NULL, pp = &result; 

for ( ; start <= stop; start += step) { 
     *pp = malloc (sizeof **pp); 
     if (!*pp) break; 
     (*pp)->value = start; 
     pp = &(*pp)->next; 
     } 
*pp = NULL; 
return result; 
} 

main()被調用,如:


list1Ptr = listNode_generate(1,10,2);