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