创建节点列表 [英] Creating a node List
问题描述
嘿伙计们,我被指派构建一个程序,它将创建一个包含 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屋!