2014-07-01 67 views
0

嘿傢伙我被分配來構建一個程序,它將創建一個包含300個節點的節點列表。每個節點必須有一個從1-100的隨機數的堆棧。之後,我必須打印列表和堆棧加上所有數據的總和。有任何想法嗎?創建一個節點列表

到目前爲止我的代碼是

#include <stdio.h> 
#include <stdlib.h> 
struct listNode {    // <====== 
    char data; 
    struct listNode *nextPtr; 
}; 
typedef struct listNode ListNode; 
typedef ListNode* ListNodePtr; 
void insert(ListNodePtr *sPtr, char value); 

char delete(ListNodePtr *sPtr, char value); 

int isEmpty(ListNodePtr sPtr); 

void printList(ListNodePtr currentPtr); 

void instructions(void); 

int main(int argc, char** argv) { 
    ListNodePtr startPtr = NULL; 
    int choice; 
    char item; 
    instructions(); 
    printf("? "); 
    scanf("%d", &choice); 
    while (choice != 3) { 
    switch (choice) { 
    case 1: 
     printf("Enter a character: "); 
     scanf("%c", &item); 
     insert(&startPtr, item); 
     printList(startPtr); 
     break; 
    case 2: 
     if (!isEmpty(startPtr)) { 
      printf("Enter character to be deleted: "); 
      scanf("\n%c", &item); 
     if (delete(&startPtr, item)) { 
      printf("%c deleted.\n", item); 
      printList(startPtr); 
     } else { 
     printf("%c not found.\n\n", item); 
     } 
    } else { 
     printf("List is empty.\n\n"); 
    } 
     break; 
     default: 
     printf("Invalid choice.\n\n"); 
     instructions(); 
     break; 
    } 
printf("? "); 
scanf("%d", &choice); 
} 
printf("End of run.\n"); 
system("PAUSE"); 
return (EXIT_SUCCESS); 
} 

void instructions(void) { //<-- klhsh g odigies 
printf("Enter your choice: n" 
" 1 to insert an element into list.\n" 
" 2 to delete an element from the list.\n" 
" 3 to end.\n"); 
} 
void insert(ListNodePtr *sPtr, char value) { 
    ListNodePtr newPtr, previousPtr, currentPtr; 
    newPtr = malloc(sizeof (ListNode)); 
    if (newPtr != NULL) { 
    newPtr->data = value; 
    newPtr->nextPtr = NULL; 
    previousPtr = NULL; 
    currentPtr = *sPtr; 
    while (currentPtr != NULL && value > currentPtr->data) { 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
    } 
    if (previousPtr == NULL) { 
     newPtr->nextPtr = *sPtr; 
     *sPtr = newPtr; 
    } else { 
     previousPtr->nextPtr = newPtr; 
     newPtr->nextPtr = currentPtr; 
    } 
    } else { 
    printf("%c not inserted. No memory available.\n", value); 
    } 
} 


char delete(ListNodePtr *sPtr, char value) { //<-- delet 
    ListNodePtr previousPtr, currentPtr, tempPtr; 
    if (value == (*sPtr)->data) { 
    tempPtr = *sPtr; 
    *sPtr = (*sPtr)->nextPtr; 
    free(tempPtr); 
    return value; 
    } else { 
    previousPtr = *sPtr; 
    currentPtr = (*sPtr)->nextPtr; 
    while (currentPtr != NULL && currentPtr->data != value) { 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
    } 
    if (currentPtr != NULL) { 
     tempPtr = currentPtr; 
     previousPtr->nextPtr = currentPtr->nextPtr; 
     free(tempPtr); 
     return value; 
    } 
    } 
return '\0'; 
} 


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

void printList(ListNodePtr currentPtr) { 
if (currentPtr == NULL) { 
    printf("List is empty.\n\n"); 
} else { 
    printf("The list is:\n"); 
    while (currentPtr != NULL) { 
    printf("%c --> ", currentPtr->data); 
    currentPtr = currentPtr->nextPtr; 
    } 
    printf("NULL\n\n"); 
} 
} 
+1

你有什麼問題? – Kabulan0lak

+6

錯誤404。未找到問題 – Jerky

回答

1

仍不能確定你的問題是什麼,但你有你的代碼的一些問題。

在插入,你有這樣一行:

if (previousPtr == NULL) { 
     newPtr->nextPtr = *sPtr; 
     *sPtr = newPtr; 

在這種情況下,您要添加的第一個節點到列表中。您無需在取消引用的sPtr旁邊設置newPtr。它應該是NULL,因爲該列表的頭部沒有下一個項目。


在刪除中,您有一個單獨的檢查列表的頭部,然後其餘的。您可以將支票凝結成一個並清理代碼。

這將是這個樣子:中

currentPtr = *sPtr; 
while (currentPtr != NULL && currentPtr->data != value) { //walking the linked list 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
} 
if(currentPtr == NULL) return '\0'; //end early if you don't find anything 
previousPtr->nextPtr = currentPtr->nextPtr; //since it's singly linked, just skip the currrent ptr 
char temp = currentPtr->data; 
free(currentPtr); 
return temp; 

代替:

if (value == (*sPtr)->data) { 
    tempPtr = *sPtr; 
    *sPtr = (*sPtr)->nextPtr; 
    free(tempPtr); 
    return value; 
    } else { 
    previousPtr = *sPtr; 
    currentPtr = (*sPtr)->nextPtr; 
    while (currentPtr != NULL && currentPtr->data != value) { 
     previousPtr = currentPtr; 
     currentPtr = currentPtr->nextPtr; 
    } 
    if (currentPtr != NULL) { 
     tempPtr = currentPtr; 
     previousPtr->nextPtr = currentPtr->nextPtr; 
     free(tempPtr); 
     return value; 
    } 
    } 
return '\0';