#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
typedef struct listnode{
    int item;
    struct listnode *next;
}ListNode;

typedef struct _linkedlist{
    ListNode *head;
    int size;
} LinkedList;

void printList(LinkedList *ll);
int sizeList(LinkedList *ll);
int insertSorted(LinkedList *ll, int value);
int removeDuplicates(LinkedList *ll);

int main()
{
    int choice, i = 0;
    ListNode *temp=NULL;
    LinkedList *ll=NULL;

    printf("1. create LinkedList\n2. insertSorted\n3. removeDuplicates\nChoose an option: ");
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        printf("Enter a list of numbers, terminated by the value -1: ");
        scanf(" %d", &i);
        while (i != -1){
            if (ll == NULL)
            {
                ll = malloc(sizeof(LinkedList));
                temp = ll;
            }
            else
            {
                temp->next = malloc(sizeof(ListNode));
                temp = temp->next;

            }
            temp->item = i;
            scanf(" %d", &i);
        }
        temp->next = NULL;
        printList(&ll);
        printf("Size of linked is %d", sizeList(&ll));
        break;
    case 2:

    default:
        break;
    }
}

void printList(LinkedList *ll)
{
    ListNode *temp = ll->head;
    if (temp == NULL)
        return;
    while (temp!=NULL)
    {
        printf("%d ", temp->item);
        temp = temp->next;
    }
    printf("\n");
}

int sizeList(LinkedList *ll)
{
    int size=0;

    ListNode *temp = ll->head;
    if (temp == NULL)
        return 0;

    while (temp != NULL)
    {
        size++;
        ll->size = size;
        temp = temp->next;
    }
    return ll->size;
}


我想创建一个链表并计算链表的大小并输出。我设法获取大小并打印出列表,但是最后,我的程序显示了调试错误,并指出运行时检查失败#2-围绕变量'll'的堆栈已损坏。我可以知道为什么会这样吗?

最佳答案

错误之一是在您的main()函数中。

if (ll == NULL)
{
    ll = malloc(sizeof(LinkedList));
    temp = ll; // <- This is incorrect!!
}
else
{
    temp->next = malloc(sizeof(ListNode));
    temp = temp->next;
}


tempListNode,如何为它分配LinkedList?同样,在该行中,templl都指向相同的内存,并且对其中一个进行操作将覆盖另一个。

可能应该是这样的:

if (ll == NULL)
{
    ll = malloc(sizeof(LinkedList));
    temp = malloc(sizeof(ListNode));
    temp->next = NULL;
    ll->head = temp;
    ll->size = 1;
}
else
{
    temp->next = malloc(sizeof(ListNode));
    temp = temp->next;
}


但这也不尽如人意。我更喜欢:

int main()
{
    int choice, i = 0;
    ListNode *temp=NULL;
    LinkedList ll = { NULL, 0 };

    printf("1. create LinkedList\n2. insertSorted\n3. removeDuplicates\nChoose an option: ");
    scanf("%d", &choice);
    switch (choice)
    {
    case 1:
        printf("Enter a list of numbers, terminated by the value -1: ");
        scanf(" %d", &i);
        while (i != -1){
            if (ll.head == NULL)
            {
                temp = malloc(sizeof(ListNode));
                ll.head = temp;
            }
            else
            {
                temp->next = malloc(sizeof(ListNode));
                temp = temp->next;
            }
            temp->item = i;
            scanf(" %d", &i);
        }
        temp->next = NULL; // <- Please take a second look at this line. What happens if your first entry is -1?
        printList(&ll); // <- This too...
        printf("Size of linked is %d", sizeList(&ll)); // <- and this as well...
        break;
    case 2:

    default:
        break;
    }
}


这是因为不需要动态分配LinkedList。只要程序正在运行,它就仍然有效,因此将其放在堆上没有意义。

您的代码还有其他问题,我建议您使用橡胶鸭嘴代码,强烈建议阅读this link on debugging

关于c - LinkedList堆栈已损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22753296/

10-11 20:35
查看更多