数据结构实验之链表七:单链表中重复元素的删除

来源:互联网 发布:windows xp原装正版iso 编辑:程序博客网 时间:2024/05/17 08:07

题目描述

按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。

输入

第一行输入元素个数n; 
第二行输入n个整数。

输出

第一行输出初始链表元素个数; 
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。

示例输入

1021 30 14 55 32 63 11 30 55 30

示例输出

1030 55 30 11 63 32 55 14 30 21730 55 11 63 32 14 21

注意:

1,本题在输入建立时,应当进行倒序建立。
2,在去除重复元素时,应注意以下两段程序的区别(红字标明出【特别是红字标明处的蓝字部分】

    p=head->next;

    q=p->next;

    while(p->next!=NULL)

    {    t=p;

        while(q!=NULL)

        {

            if(p->date==q->date)

            {

                q=q->next;

                t->next=q;

                n--;

            }

            else

            {

                q=q->next;

                t=t->next;

            }

        }

        p=p->next;

        q=p->next;

    }

printf("%d\n",n);

//***************************//   

    p=head->next;

    q=p->next;

    while(p->next!=NULL)

{   t=p;

        while(q!=NULL)

        {

            if(t->date==q->date)

            {

                q=q->next;

                t->next=q;

                n--;

            }

            else

            {

                q=q->next;

                t=t->next;

            }

        }

        p=p->next;

        q=p->next;

    }

    printf("%d\n",n);

//**************************//

判断时为两个重叠的while循环,而在判断时应保证总链元素的值在第二重循环里的恒定,故引入指针t,而重复元素不一定紧跟着上一元素而是存在于整个链表中,故在内循环里变化得为t,而进行判断的为p.外循环里再让p进行变化。
 

来源

不得使用数组!

示例程序
#include <stdio.h>#include <stdlib.h>typedef struct nod{    int date;    struct nod *next;}*dnp,np;int main(){    dnp head,p,q,t;    int n,i;    head=(dnp)malloc(sizeof(np));    head->next=NULL;    scanf("%d",&n);    for(i=0; i<n; i++)    {        p=(dnp)malloc(sizeof(np));        scanf("%d",&p->date);        p->next=head->next;        head->next=p;    }    printf("%d\n",i);    p=head->next;    while(p!=NULL)    {        printf("%d",p->date);        if(p->next!=NULL)            printf(" ");        p=p->next;    }    printf("\n");    p=head->next;    while(p->next!=NULL)    {        q=p->next;        t=p;        while(q!=NULL)        {            if(p->date==q->date)            {                q=q->next;                t->next=q;                n--;            }            else            {                q=q->next;                t=t->next;            }        }        p=p->next;    }    printf("%d\n",n);//**************************//    p=head->next;    while(p!=NULL)    {        printf("%d",p->date);        if(p->next!=NULL)            printf(" ");        p=p->next;    }    return 0;}

0 0