C语言删除链表重复结点的一个小bug帮下。

#include<stdio.h>#include<stdlib.h>typedef struct LINK{int data;struct LINK *next;}LINK;void RemoveDuplicates(LINK *head);void write(LINK *head);int main(){ int a[] = {1,2,4,3,2,5,3,4,5,6,3,3,24,5,2,32}; LINK *head; int i = 0; LINK *p; head = (LINK *)malloc(sizeof(LINK)); head->next = NULL; for(i= 0;i<16;i++) { p = (LINK *)malloc(sizeof(LINK)); p->next = NULL; p->data = a[i]; p->next = head->next; head->next = p; } write(head); RemoveDuplicates(head); write(head);}void RemoveDuplicates(LINK *head){ LINK *p = head;//后面数据 LINK *q = head;//前面数据 while(q->next!=NULL) { while(p->next->next!=NULL) { if(q->next->data == p->next->next->data)//p->next->next 是重复的。 { printf("%d",p->next->next->data); p->next->next = p->next->next->next; } p = p->next;//指针后移。 } q = q->next; p = q; }}void write(LINK *head){ LINK *p; p = head; while(p->next!=NULL) { printf("%d\t",p->next->data); p->next = p->next->next; }}

这个是代码,我执行出来没有结果。不知道哪里出问题了。

另外看看这道题我做的还有没有可优化的空间?
最高悬赏了。
把第一个 write(head); 注释掉之后结果倒是差不多,但是为什么多了第一个的输出结果?

还有一个问题,题中所要求的不许使用数据缓冲区是什么意思?我这样算是使用数据缓冲区了吗?

#include<stdio.h>
#include<stdlib.h>
typedef struct LINK{
int data;
struct LINK *next;
}LINK;
void RemoveDuplicates(LINK *head);
void write(LINK *head);
int main()
{
    int a[] = {1,2,4,3,2,5,3,4,5,6,3,3,24,5,2,32}; 
    LINK *head;
    int i = 0;
    LINK *p;
    head = (LINK *)malloc(sizeof(LINK));
    head->next = NULL;
head->data = a[0];
p = head;
    for(i= 1;i<16;i++)
    {
        p->next = (LINK *)malloc(sizeof(LINK));
p = p->next;
        p->next = NULL;
        p->data = a[i];
    }
    write(head);
    RemoveDuplicates(head);
    write(head);
getch();
}
void RemoveDuplicates(LINK *head)
{
    LINK *p = head;//后面数据
    while(p->next != NULL)
    {    
LINK *q = p;//前面数据
        while (q->next != NULL)
        {
            if(q->next->data == p->data)//p->next->next 是重复的。
            {    
                printf("remove %d \n", p->data);
                q->next = q->next->next;
            }
else
              q = q->next;//指针后移。
        }
        p = p->next;
    }
}
void write(LINK *head)
{
    LINK *p;
    p = head;
    while(p !=NULL)
    {
        printf("%d\t",p->data);
        p = p->next;
    }
}

追问

再不借助数据缓冲区的情况下,我这样的查重算法算是效率高的吗?还有更高的吗?
好吧,原来你已经改了我的算法。确实这样比较次数少了好多

温馨提示:答案为网友推荐,仅供参考
相似回答