此代码段中的分段错误原因

时间:2014-07-08 22:43:00

标签: c linked-list

问题:编写一个函数Duplicates(),它接受​​一个包含整数的列表,并在从列表中删除所有重复的条目后返回列表。

因此,在列表20, 25, 25, 30, 40, 45, 45, 45, 60的情况下,它应该返回20, 25, 30, 40, 45, 60。 *尝试了这段代码,它给出了分段错误。*

#include <stdio.h>

typedef struct node{
    int d;
    struct node* next;
}node;

typedef node* list;

void printList(list a)
{
    while(a!=NULL)
    {
        printf("  %d",a->d);
        a=a->next;
    }
}

int main()
{
    int i,flag,n,v;
    list head,tail,new,a,taila,b,c;
    scanf("%d",&n);
    scanf("%d",&v);
    tail=head=NULL;
    head=(list)malloc(sizeof(node));
    head->d=v;
    head->next=NULL;
    tail=head;
    for(i=2;i<=n;i++)
    {
        scanf("%d",&v);
        new=(list)malloc(sizeof(node));
        new->d=v;
        new->next=NULL;
        tail->next=new;
        tail=new;
    }
    printf("Before working \n");
    printList(head);
    printf("After working \n");
    a=(list)malloc(sizeof(node));
    taila=NULL;
    a->d=head->d;
    a->next=NULL;
    taila->next=a;
    taila=a;
    b=head;
    for(i=2;i<=n;i++)
    {
        c=head;
        while(c!=b)
        {
            if(c->d==b->d)
                flag++;
            c=c->next;
        }
        if(flag==0)
        {
            new=(list)malloc(sizeof(node));
            new->d=b->d;
            new->next=NULL;
            taila->next=new;
            taila=new;
        }

        b=b->next;
    }
    printList(a);


    return 1;
}

5 个答案:

答案 0 :(得分:0)

我认为您想要完成的想法是创建一个新的链接列表,每当您在输入链接列表中看到一个不在结果链接列表中的值时,就会向其添加一个新节点。

要完成此任务,请尝试从输入链接列表H的开头步行,如下所示:

create return and temp nodes;
int length = 0;
while(temp -> next != NULL){
   ...walk the input list...
   for(int i = 0; i < length; i++){
      ...walk return list checking temp's payload...
      if(payload seen){break;}
      ...if not seen then add a new node to the return list and increment length...     
   }
   temp = temp -> next;
}
return returnList;

如果你对这里的概念感到满意,需要更具体的帮助,请告诉我。这听起来好像你很难想到如何开始。

答案 1 :(得分:0)

for(i=2;i<=n;i++)

输入区域中的

不正确。您想接受n输入吗?然后使用:

for(i=0;i<n;i++)

这样你确实收到'n'个输入。

为您的列表添加:

tail->next=new; tail=new;

也不会做你想做的事。为什么甚至有尾指针?大多数列表是从头指针“向后”构建的:基本上创建一个节点,让当前的head-&gt;下一次更新它,然后将新节点设置为head,接下来是NULL。

哎呀,一个非常简单的谷歌搜索“链接列表C代码”产生了100个你可以用作例子的结果,但你不敢直接使用它们,否则你的老师会因你的作弊而失败。

我可以继续关于单字母变量名,没有错误检查malloc / scanf等等,但现在浪费时间。现在,修复输入循环并查看其他一些链接列表代码,然后重试。

答案 2 :(得分:0)

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

typedef struct node{
    int d;
    struct node* next;
}node;

typedef node* list;

void printList(list a){
    while(a!=NULL){
        printf("%d ", a->d);
        a=a->next;
    }
    printf("\n");
}

void drop_list(list a){
    if(a){
        drop_list(a->next);//Processing in the loop is better
        free(a);
    }
}

void Duplicates(list root){
    node *curr, *tmp;
    curr = root;
    if(!curr)
        return ;
    tmp = curr->next;
    if(!tmp)
        return;
    while(tmp){
        if(curr->d != tmp->d){
            curr = curr->next;
            curr->d = tmp->d;
        }
        tmp = tmp->next;
    }
    drop_list(curr->next);
    curr->next = NULL;
}

node *new_node(int value){
    list node = malloc(sizeof(*node));
    node->d = value;
    node->next = NULL;
    return node;
}

int main(){
    int data[] = { 20, 25, 25, 30, 40, 45, 45, 45, 60 };
    list head, tail;
    int i, n = sizeof(data)/sizeof(*data);

    tail = head = new_node(data[0]);
    for(i=1;i < n;i++)
        tail = tail->next = new_node(data[i]);

    printf("Before working \n");
    printList(head);

    Duplicates(head);

    printf("After working \n");
    printList(head);

    drop_list(head);
    return 1;
}
//

答案 3 :(得分:0)

我认为你必须删除
      taila-&gt;接着= A;顺序       A-&gt;接着= NULL;       taila-&gt;接着= A;       taila = A; 在这里,您尝试调用尚未声明的节点,因为taila本身为null。您可以在删除该语句后尝试使用它。

答案 4 :(得分:0)

就我所理解的逻辑而言,你需要删除一些缺陷,然后你的逻辑可能会起作用。尝试这个:        对于(I = 1; I&LT; = N;我++)         {             标志= 0;             C =头;             而(C!= b)的             {                 如果(C-&GT; d == B-&GT; d)                     标志++;                 C = C-&gt;接着,             }             if(flag == 0&amp;&amp; i == 1)             {                 α=(列表)的malloc(的sizeof(节点));                 A-&GT; d = B-&GT; d;                 A-&gt;接着= NULL;                 taila = A;             }             否则if(flag == 0)             {                 新=(列表)的malloc(的sizeof(节点));                 新建 - &GT; d = B-&GT; d;                 新建 - &gt;接着= NULL;                 taila-&gt;接着=新;                 taila =新;             }

        b=b->next;
    }