我遇到了一个问题:在一个函数中,如果节点值相同,程序需要比较两个节点并删除其中一个节点(例如:A - > B - > B - > C> >> A - > B - > C)。简而言之:它必须只留下唯一的节点。
我已经完成的步骤:从数据文件中给出的数据创建列表并完美打印出来。现在我正在努力比较两个节点。
我正在考虑做的步骤:将两个节点值放在两个不同的变量中,然后比较这两个变量,如果最新节点等于previous,则删除最新的并以某种方式将前一个节点链接到下一个节点。然后循环又重新开始了。
问题:如何将节点与另一节点进行比较?
这是我现在的代码:
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 255
struct node {
int info;
struct node *next;
} *head = NULL;
int create(FILE **data){
char read[LENGTH];
printf("Write data file name: ");
scanf("%s", read);
*data = fopen (read, "r");
if (data == NULL) {
printf("Error reading given file.");
}
return 0;
}
int put_Symbols_into_list(FILE *data) {
struct node *new_node, *current;
char c;
printf("Data given: ");
while (!feof(data)){
new_node = (struct node*)malloc(sizeof (struct node));
c = fscanf(data, "%s", &new_node -> info);
printf("%s ", &new_node -> info);
if (head == NULL){
head = new_node;
current = new_node;
} else {
current -> next = new_node;
current = new_node;
}
}
}
int delete_Same_Symbols() {
}
int main() {
FILE *data;
struct node *n;
create(&data);
put_Symbols_into_list(data);
delete_Same_Symbols();
//display_List(n);
return 0;
}
答案 0 :(得分:0)
删除重复项的有效方法如下:
1. Sort the list
2. Run through the list once deleting any adjacent duplicates.
此解决方案是否适合您取决于您的数据是否可以订购。
答案 1 :(得分:0)
从头到尾遍历列表并维护哈希表。 对于每个元素,检查值是否在哈希表中:如果是,则删除该节点;否则将值放在哈希表中。
时间复杂度:平均为O(n)(假设哈希表访问时间平均为O(1))。
答案 2 :(得分:0)
我将为您提供删除重复项的功能。
假设您的代码运行正常并且信息是 int值
请注意,如果info是一个字符串,则需要使用strcmp函数而不是head->info == info.
int exist(NODE *head, int info) {
while (head && head->info != info) // strcmp(info,head->info) != 0
head = head->next;
return head->info == info; // strcmp(info,head->info)
}
void removeDuplicates(NODE **phead, int info) {
NODE *tmp = *phead;
while (tmp->info != info) // strcmp(info,head->info) != 0
tmp = tmp->next;
NODE *tmp1 = tmp->next;
tmp->info = tmp1->info; // strcpy(tmp->info,tmp1->info)
tmp->next = tmp1->next;
free(tmp1);
}