gpt4 book ai didi

创建节点列表

转载 作者:行者123 更新时间:2023-11-30 15:31:52 25 4
gpt4 key购买 nike

大家好,我被分配构建一个程序,它将创建一个包含 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");
}
}

最佳答案

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

在插入中,您有这一行:

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

关于创建节点列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24511625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com