问题:编写一个函数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。您可以在删除该语句后尝试。