C ++函数和方法中的链接列表

时间:2015-04-16 06:09:47

标签: c linked-list

我正在学校上课,现在我们正在谈论链表。教授给了我们一个源文件,其中包含“插入第一”,“遍历”和“自由列表”功能,并使用主要方法测试和演示它们。我们的家庭作业是创建四个新功能:

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

1 个答案:

答案 0 :(得分:0)

insertLast您实施它的方式不是insertLast,而是insertSecond。当然,如果列表中没有元素,它会崩溃,因为insertSecond在该上下文中没有意义。 要正确执行此操作,您需要遍历列表,确定最后一个元素,然后插入该元素。

inOrder访问start->value,而不检查start是否为空。

顺便说一下,这是C而不是C ++,而且我确信你的教授会指出很多风格和界面问题。