创建节点列表

时间:2014-07-01 13:33:09

标签: c nodes

嘿伙计们,我被分配来构建一个程序,它将创建一个包含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 个答案:

答案 0 :(得分:1)

仍然不确定您的问题是什么,但您的代码存在一些问题。

在插入中,你有这一行:

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

在这种情况下,您将第一个节点添加到列表中。您不需要在解除引用的newPtr旁边设置sPtr。它应该是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';