设计一个算法,从头节点为L的带表头节点的有序单链表中删除所有数值相同的多余元素并释放节点空间

//问题:设计一个算法,从头节点为head的带表头节点的有序单链表中删除所有数值相同的多余元素并释放节点空间
//思路:单链表已经有序,定义n等于链表的第一个值,向后遍历,若往后有数值相等的,就删除该节点,若遇到数值不相等的,就把值赋给n,这样一直向后

#include "stdio.h"
#include<stdlib.h>
typedef struct Node{    //结构体
    int data;
    Node *next;
}Node;
void init(Node *&p);
void listCreate(Node *&p,int n);
void Traversal(Node *&p);


//**********核心算法代码******************
void deleteSame(Node *&h){
    Node *p=h->next;
    Node *q = p->next;   //q永远是p的后继
    int a;
    while(q!=NULL){
        a=p->data;
        if(a==q->data){     //若前一个节点的值等于后一个节点的值
            p->next=q->next;   //逻辑删除该节点,并使被删除节点前后连接
            free(q);           //释放该节点的空间(彻底删除节点)
            q=p->next;         //由于q此时是个空指针,所以重新让它称为p的后继
        }else{              //不等
            p=p->next;      //p往后
            q=q->next;      //q往后
        }        
    } 
}
//*****************************************

int main(){
    Node *head = (Node *)malloc(sizeof(Node));
    init(head);
    int a[] ={1,2,3,3,3,4,5,6,6,7,8,9}; 
    //int a[] = {1,2,3,4,5,6,7,8,9,10,11,12};
    for(int i=0;i<12;i++){
        listCreate(head,a[i]);
    }
    deleteSame(head);
    Traversal(head);
    //printf("%d",head->data);
    getchar();
    return 0;
}
void init(Node *&p){    //初始化
    p->next = NULL;
}

void listCreate(Node *&p,int n){      //参数:头节点,数据
    Node *q = (Node *)malloc(sizeof(Node));
    //****头插法建立(插入)链表*********(后进先出)
    q->data = n;
    q->next = p->next;
    p->next = q;
    //****************
}

void Traversal(Node *&p){   //遍历
    Node *q = p->next;
    while (q != NULL)
    {
        printf("%d ",q->data);
        q = q->next;
    }
}
posted @ 2020-11-10 19:51  封不烦  阅读(923)  评论(0编辑  收藏  举报