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

来源:互联网 发布:软件招标网 编辑:程序博客网 时间:2024/05/01 03:34

数据结构实验之链表七:单链表中重复元素的删除
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description

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

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

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

10
21 30 14 55 32 63 11 30 55 30

Example Output

10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21

#include <stdio.h>#include <malloc.h>#define LEN sizeof(struct node)typedef struct node{    int data;    struct node* next;}node;node *creat(int n){    struct node* head,*p;    int i;    head=(struct node*)malloc(sizeof(LEN));    head->next=NULL;    for(i=0;i<n;i++){//逆序建立链表 指针的下一个为头结点的下一个 头结点的下一个又为指针,这样做到了逆序的存储        p=(struct node*)malloc(sizeof(struct node));        scanf("%d",&p->data);        p->next=head->next;        head->next=p;    }    return head;};void convert(node *head,int n)//该死的来了,删除链表中重复的数据{    node *p,*q,*t;    p = head->next;//首先 p,t指向的都是头结点的下一个结点    while(p){        t = p;//初始t与p同时为头结点的下一个结点,t用来临时存储“要删除结点的前一个结点” 首先要知道删除结点的前一个结点才能删除该结点        q = p->next;//q为p的下一个结点,这里我一直弄不清楚 为什么这句要放在循环里面(知道的朋友麻烦给我留言        while(q){            if(p->data==q->data){//q在链表中遍历一遍,看是否有和第一个结点相等的                n--;                t->next = q->next;//当存在相等,t的下一个结点就直接为q的下一个结点,直接跳过q                q = t->next;//同时,q也要往后移,及t的后继            }            else{//否则,t,q往后走                t = t->next;                q = q->next;            }        }        p = p->next;//当内循环结束后(第一个结点p遍历第一个结点后的所有元素比较是否相等) 现在继续让p后移继续比较p之后的元素    }    printf("%d\n",n);}void show(node *head){    node *p;    p = head->next;    printf("%d",p->data);    p = p->next;    while(p){        printf(" %d",p->data);        p = p->next;    }    printf("\n");}int main(){    node *head;    int n;    scanf("%d",&n);    head = creat(n);    printf("%d\n",n);    show(head);    convert(head,n);    show(head);    return 0;}

这题做了好久,主要还是链表的删除不能理解透,到头来还是一直问别人
七改八改的终于完成了

0 0
原创粉丝点击