C仅在单链表中保留唯一节点的功能

时间:2014-12-13 17:53:53

标签: c nodes singly-linked-list

我遇到了一个问题:在一个函数中,如果节点值相同,程序需要比较两个节点并删除其中一个节点(例如: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;
}

3 个答案:

答案 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);
}