试写一算法,删除元素非递减排列的单链表L中所有值相同的元素。即相同元素值只保留一个。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef char Status;
typedef char ElemType;
//链表结构体、指向链表的指针
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LNode,*LinkList;
Status InitList(LinkList &L);
Status CreatList(LinkList &L, int n, ElemType Data[]);
Status RemoveDuplicates(LinkList &L);
void OutputL(LinkList &L);
//试写一算法,删除元素非递减排列的单链表L中所有值相同的元素,即相同元素值只保留一个
int main()
{
LinkList L;
ElemType a[24] = {"123ABC04631xyzaxzc10086"};
InitList(L);
CreatList(L,24,a);
printf("原表:\n");
OutputL(L);//输出原表
RemoveDuplicates(L);
printf("\n删除重复项后:\n");
OutputL(L);
return 0;
}
//初始化单链表
Status InitList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode)); /*产生头结点,并使L指向此头结点*/
if(!L)
return ERROR;
L->next=NULL;
return OK;
}
//尾插法创建单链表
Status CreatList(LinkList &L,int n,ElemType Data[])
{
LinkList s,r;
int i;
if(!L || L->next)
return ERROR;
for(i=0, r=L; i<n; i++)
{
s=(LinkList)malloc(sizeof(LNode));
if(!s)
return ERROR;
s->data =Data[i];
s->next = r->next;
r->next = s; /*将尾结点的指针指向新结点 */
r = r->next; /*将当前的新结点定义为新的尾结点*/
}
return OK;
}
//输出单链表
void OutputL(LinkList &L)
{
LinkList p;
if(L)
{
p=L->next;
while(p)
{
printf("%c ",p->data );
p=p->next;
}
}
}
Status RemoveDuplicates(LinkList &L)
{
LinkList p,q;
p = L->next;
while(p->next)
{
q = p;
while(q->next)
{
if(p->data == q->next->data)
{
printf("删除了%c\n",q->next->data);
LinkList temp = q->next;
q->next = temp->next;
delete temp;
}
q = q->next;
}
p = p->next;
}
return OK;
}