[20220316]试写一算法,删除- -条带头结点的链表中所有data域重复的结点,但每种重复的结点都需要保留一个。

[20220316]试写一算法,删除- -条带头结点的链表中所有data域重复的结点,但每种重复的结点都需要保留一个。

//双向链表的类型定义为:
typedef char ElemType;
typedef struct DuLNode {
ElemType data;
struct DuLNode *prior, *next; //分别指向直接前驱和直接后继
} DuLNode, *DuLinkList; //双向链表

实现下列函数:
DuLinkList delDuplicateDuLNodes(DuLinkList L)
//返回一个无重复结点的双向链表

 使用稀疏矩阵,快速转置中的一部分想法 用  *n 去储存data个数 可惜不知道为什么错了
 

#include "allinclude.h"  //DO NOT edit this line
DuLinkList delDuplicateDuLNodes(DuLinkList L)
{   // Add your code here
if(L==NULL)
return ERROR;
 ElemType* n;//记录结点data相同的个数;
 DuLNode* p;
 DuLNode* t;
 int h;
 p=L;
 if(p->next==NULL)return ERROR;
 for(;p->next!=NULL;p=p->next)//遍历链表
 {
    h++;//记录链表多少个元素
 }
 n=(ElemType*)malloc((150)*sizeof(ElemType));
 
 for(;p->next!=NULL;p=p->next)//遍历链表
 {
    n[p->next->data]=0;    //初始化n
 }
 p=L;
 /*for(;p->next!=NULL;p=p->next)//遍历链表
 {
    ++n[p->next->data];  //记录data相同的个数
 }*/
 //p=L;
 n[p->data]=0;
 while(p->next!=NULL)
 {
   ++n[p->next->data];
   if(p->next==NULL)break;
    while(n[p->data]>1)//大于1就删去
    {
       //--n[p->next->data];
      t=p->next;
      p->next=t->next;
      if(t->next!=NULL)
      {
t->next->prior=p;
      }
       free(t);
       if(p->next==NULL)break;
    }
    p=p->next;
 }
 return L;
}

可通过代码
 

#include "allinclude.h"  //DO NOT edit this line
DuLinkList delDuplicateDuLNodes(DuLinkList L)
{   // Add your code here
DuLNode* t;
DuLNode* p;
DuLNode* l;
if(L==NULL)return ERROR;
t=L;
p=L->next;
for(;p!=NULL;p=p->next)
{
   for(t=L;t!=p;t=t->next)
   {
      while(t->data==p->data)//删除
      {
         l=p;
         p=p->next;
         if(p!=NULL)
         {
            l->prior->next=p;
         p->prior=l->prior;
         free(l);
         }
         if(p==NULL)
         {
            l->prior->next=NULL;
            return L;
         }
         t=L;
      
      }
   }
}
return L;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值