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

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

Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。

Input
第一行输入元素个数 n (1 <= n <= 15);
第二行输入 n 个整数,保证在 int 范围内。

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

Sample Input
10
21 30 14 55 32 63 11 30 55 30
Sample Output
10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21
Hint
Source
不得使用数组!

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef struct LNode{
    int data;
    struct LNode *next; 
}*LinkList,LNode;
LinkList createLinkList(LinkList &head,int n){
    LNode *tail,*p;
    head =tail = (LinkList)malloc(sizeof(LNode));
    head->next = NULL;
    tail = head;
    tail->next = NULL;
    for (int i=0;i<n;i++)
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->next = NULL;
        scanf("%d",&p->data);
        p->next = tail->next; //顺序不能错
        tail->next = p;
    }
    return head;

}
void display(LinkList p){
    p=p->next;
    while(p){
        if (p->next)
        {
            printf("%d ",p->data);
        }else{
            printf("%d
",p->data);
        }
        p = p->next;
    }

}
void deleteSameData(LinkList &L,int n){

    LNode *p = L->next,*q,*r;
    int count = 0;
    q = p;    
    while(p){
        while(q->next){
            if (p->data == q->next->data) //p为当前元素 r为p以后的任意结点 q为r的前驱
            {//如果当前结点q和r(q->next)值相等, 找到第
                r = q->next;
                q->next = r->next;
                count++;
                free(r);
            }else{
                q=q->next;
            }
        }
        p=p->next;
        q = p;
    }
    printf("%d
",n-count);
    display(L);
}
int main(){
    int n;
    scanf("%d",&n);
    LinkList linklist = NULL;
    createLinkList(linklist,n);
    printf("%d
",n);
    display(linklist);
    deleteSameData(linklist,n);
    return 0;
}
原文地址:https://www.cnblogs.com/CCCrunner/p/11781698.html