我正在学校上课,现在我们正在谈论链表。教授给了我们一个源文件,其中包含“插入第一”,“遍历”和“自由列表”功能,并使用主要方法测试和演示它们。我们的家庭作业是创建四个新功能:
1)“计数目标” - 计算具有目标值的节点在列表中出现的次数
2)“按顺序” - 如果列表按升序排列(或者如果它为空或只有一个节点),则返回1,如果不是,则返回0
3)“首先删除” - 删除列表中的第一个节点并返回下一个节点(这是新的第一个节点)。如果list只有一个Node列表应为空,则返回Null。如果list已经为空,则不执行任何操作并返回Null。
4)“插入最后” - 通过在列表末尾而不是前面插入节点来创建列表。
到目前为止,似乎我编写的唯一功能是“删除第一”。所有其他人都没有尽我所能,我不知道为什么。 “插入最后”会导致以下错误:
“程序'[8256] Project9.exe'已退出,代码为0(0x0)。”
我不确定这是否有用或不注意;在我得到一个不再出现的不同错误之前我不知道为什么(虽然我在过去的几个小时里一直在摆弄它......)...
“按顺序”也会导致某种类型的细分,“计数目标”实际上并不会导致程序崩溃,但它也没有实现它的意义。任何和所有帮助和洞察这些令人不安的困境将非常感谢...提前感谢。
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
struct NODE
{
struct NODE *link;
int value;
};
typedef struct NODE Node;
int countTarget(Node *start, int target){
int count = 0;
while (start != NULL)
{
if (start->value == target)
count++;
start = start->link;
}
return count;
}
int inOrder(Node *start){
int inOrder = 1;
int temp;
while (start != NULL)
{
temp = start->value;
start = start->link;
if (start->value < temp){
inOrder = 0;
break;
}
}
return inOrder;
}
Node *deleteFirst(Node **ptrToHeadPtr){
if (*ptrToHeadPtr != NULL){
Node* temp = *ptrToHeadPtr;
*ptrToHeadPtr = (*ptrToHeadPtr)->link;
free(temp);
}
return *ptrToHeadPtr;
}
Node *insertLast(Node **ptrToHeadPtr, int val)
{
Node *node = (Node *)malloc(sizeof(Node));
node->value = val;
(*ptrToHeadPtr)->link = node;
*ptrToHeadPtr = node;
return node;
}
Node *insertFirst(Node **ptrToHeadPtr, int val)
{
Node *node = (Node *)malloc(sizeof(Node));
node->value = val;
node->link = *ptrToHeadPtr;
*ptrToHeadPtr = node;
return node;
}
void traverse(Node *p)
{
while (p != NULL)
{
printf("%d ", p->value);
p = p->link;
}
}
void freeList(Node *p)
{
Node *temp;
while (p != NULL)
{
temp = p;
p = p->link;
free(temp);
}
}
int main()
{
Node *HeadPtr = NULL;
int j;
printf("Now creating list with \"Insert in Front\" method: \n\n");
for (j = 0; j < 13; j++){
insertFirst(&HeadPtr, j);
printf("%d ", HeadPtr->value);
}
printf("\n\n");
printf("Now traversing list created by \"Insert in Front\" method: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
traverse(HeadPtr);
printf("\n\n");
printf("Now testing \"In Order\" method on list: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
inOrder(HeadPtr);
printf("\n\n");
printf("Now testing \"Delete from Front\" method on list: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
deleteFirst(&HeadPtr);
printf("(HeadPtr is currently: %d)\n\n", HeadPtr->value);
traverse(HeadPtr);
printf("\n\n");
freeList(HeadPtr);
printf("(HeadPtr is currently: %d)\n\n", HeadPtr->value);
HeadPtr = NULL;
printf("Now creating list with \"Insert in Rear\" method: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
for (j = 0; j < 13; j++){
insertLast(&HeadPtr, j);
printf("%d ", HeadPtr->value);
}
printf("\n\n");
printf("Now traversing list created by \"Insert in Rear\" method: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
traverse(HeadPtr);
printf("\n\n");
printf("Now testing \"In Order\" method on list: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
inOrder(HeadPtr);
printf("\n\n");
freeList(HeadPtr);
HeadPtr = NULL;
int temp;
printf("Now creating list with \"Insert in Front\" method \nand randomly generated data between 0 and 9: \n\n");
for (j = 0; j<13; j++){
temp = rand() % 9;
insertFirst(&HeadPtr, temp);
printf("%d ", HeadPtr->value);
}
printf("\n\n");
printf("Now traversing list created by \"Insert in Front\" method: (HeadPtr is currently: %d)\n\n", HeadPtr->value);
traverse(HeadPtr);
printf("\n\n");
temp = rand() % 9;
printf("Now testing \"count Target\" method on list searching for %d: (HeadPtr is currently: %d)", temp, HeadPtr->value);
countTarget(HeadPtr, temp);
freeList(HeadPtr);
getchar();
return 1;
}
答案 0 :(得分:0)
insertLast
您实施它的方式不是insertLast
,而是insertSecond
。当然,如果列表中没有元素,它会崩溃,因为insertSecond
在该上下文中没有意义。
要正确执行此操作,您需要遍历列表,确定最后一个元素,然后插入该元素。
inOrder
访问start->value
,而不检查start
是否为空。
顺便说一下,这是C而不是C ++,而且我确信你的教授会指出很多风格和界面问题。