C语言 在这段代码中出现分段错误的原因



问题:编写一个函数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;
}

就我所理解的逻辑而言,您需要删除一些缺陷,然后您的逻辑可能会工作。试试这个:(i = 1; i<= n;我+ +){国旗= 0;c =头;而(c ! = b){如果(c -> d = = b> d)国旗+ +;c = c -> next;}如果(标志= = 0,,我= = 1){=(列表)malloc (sizeof(节点));-> d = b> d;一个- - -> =零;taila =一个;}else if(标志= = 0){新=(列表)malloc (sizeof(节点));新-> d = b -> d;新-> =零;taila -> =新;taila =新;}

        b=b->next;
    }

我认为你想要完成的想法是创建一个新的链表,将有一个新的节点添加到它每次你看到一个值在你的输入链表,而不是在你的结果链表。

要做到这一点,尝试从输入链表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;

如果你对这里的概念满意,需要更具体的帮助,请告诉我。听起来你好像不知道怎么开始。

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

输入区的

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

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

所以你确实接收了'n'个输入。

为您的列表添加:

tail->next=new; tail=new;

也不会做你想做的事。为什么要有尾巴指针?大多数列表都是从头指针"向后"构建的:基本上创建一个节点,将当前的头->下一个更新到它,然后将新节点设置为头,并设置NULL next。

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

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

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

我认为你必须删除
taila -> =一个;在序列中一个- - -> =零;taila -> =一个;taila =一个;在这里,您试图调用尚未声明的节点,因为tail本身为null。您可以在删除该语句后尝试。

相关内容

  • 没有找到相关文章

最新更新