[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;
}