【问题标题】:How to overcome segmentation error while performing addition of 2 singly-linked lists?如何在添加 2 个单链表时克服分段错误?
【发布时间】:2015-10-17 08:02:25
【问题描述】:

在下面的代码中,我将数字作为输入,并将奇数发送到 list1,将偶数发送到 list2。最后,我在 list1 和 list2 中添加了值并将它们存储在 list3 中。但我是出现分段错误。请帮助我

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

struct node//list creation
{
    int data;
    struct node *next;
};

struct node *list1;
struct node *list2;
struct node *list3;

/*creating list*/
void create(struct node *l, int x)
{
    l->data = x;
    l->next = NULL;
}

/* adding elements to list*/
void addlast(struct node *li, int x)
{
    struct node *temp = NULL;
    temp = (struct node *) malloc(sizeof(struct node));
    temp->data = x;
    while (li->next != NULL)
        li = li->next;
    li->next = temp;
    temp->next = NULL;
}

/* printing values */
void print(struct node *lb)
{
    if (lb == NULL)
        printf("empty");
    else
    {
        while (lb->next != NULL)
        {
            printf(" % d->", lb->data);
            lb = lb->next;
        }
        printf(" % d->", lb->data);
    }
}

/* performing addition */
void add(struct node *l1, struct node *l2)
{
    int value, c = 0;
    while (l1->next != NULL || l2->next != NULL)
    {
        value = l1->data+l2->data;
        if (c == 0)
        {
            create(list3, value);
            c++;
        }
        else
        {
            addlast(list3, value);
        }
        l1 = l1->next;
        l2 = l2->next;
    }
    printf("list3");
    print(list3);
}

int main()
{
    int i, n, a[20], c1 = 0, c2 = 0;
    list1 = (struct node *) malloc(sizeof(struct node));
    list2 = (struct node *) malloc(sizeof(struct node));
    list3 = (struct node *) malloc(sizeof(struct node));

    printf("\n Enter the number of numbers");
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);

        if (a[i] % 2 == 0)
        {
            if (c1 == 0)
            {
                create(list1, a[i]);
                c1++;
            }
            else
                addlast(list1, a[i]);
        }
        if (a[i] % 2 != 0)
        {
            if (c2 == 0)
            {
                create(list2, a[i]);
                c2++;
            }
            else
                addlast(list2, a[i]);
        }

    }
    printf("list1");
    print(list1);
    printf("\n");
    printf("list2");
    print(list2);
    add(list1, list2);
    return 0;
}

【问题讨论】:

  • SEGMENTATION FAULT的第一个可能原因,你没有检查malloc()的返回值,第二个可能的原因你没有检查scanf()的返回值。如果我是编译器,我会拒绝编译如此丑陋的格式错误的代码。

标签: c pointers data-structures linked-list


【解决方案1】:

问题是你在 add 中的 while 循环条件。您应该检查 l1->next 或 l2->next 是否为空。这是修正后的版本。

/* performing addition */
void add(struct node *l1, struct node *l2)
{
    int value, c = 0;
    //you can only add if the two lists have same number of elems
    while (l1->next != NULL && l2->next != NULL)
    {
        value = l1->data + l2->data;
        if (c == 0)
        {
            create(list3, value);
            c++;
        }
        else
        {
            addlast(list3, value);
        }
        l1 = l1->next;
        l2 = l2->next;
    }

    //if lists dont have equal number of elements
    //find the list which is not empty and append the
    //elems to l3 here
    printf("list3");
    print(list3);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2012-09-22
    相关资源
    最近更新 更多