创建节点列表 [英] Creating a node List

查看:41
本文介绍了创建节点列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

嘿伙计们,我被指派构建一个程序,它将创建一个包含 300 个节点的节点列表.每个节点必须有一个堆栈,其中包含 1-100 的随机数.之后我必须打印列表和堆栈加上所有数据的总和.有什么想法吗?

Hey guys i was assigned to build a programm that it will create a node list of 300 nodes. Each node must have a stack with random numbers from 1-100. After that i have to print the list and the stacks plus the sum of all the data. Any ideas?

到目前为止我的代码是

#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");
 }
}

推荐答案

仍然不确定您的问题是什么,但是您的代码有一些问题.

Still not sure what your question is, but you have some issues with your code.

在插入中,您有这一行:

In insert, you have this line:

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

在本例中,您将第一个节点添加到列表中.您不需要在取消引用的 sPtr 旁边设置 newPtr.它应该是 NULL 因为列表的头部没有下一个项目.

In this case, you're adding the first node to the list. You don't need to set newPtr's next to the dereferenced sPtr. It ought to be NULL since the head of the list doesn't have a next item.

在删除中,您对列表的头部和其余部分进行单独检查.您可以将支票压缩为一张并清理代码.

In delete, you have a separate check for the head of the list and then the rest of it. You can condense the check into one and clean up the code.

它看起来像这样:

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';

这篇关于创建节点列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆