#include <stdio.h>
#include <stdlib.h>
/******************************************************************
*author@zs *
*date@2019-10-05 *
*desc@Single linked list deduplication *
*******************************************************************/
/**自定义数据类型**/
typedef char Datatype;
/**声明结构体**/
struct Node
{
Datatype data;
struct Node *next;
};
/**结构体定义**/
typedef struct Node SNode; //结点
typedef struct Node* SLinkNode; //指针
/**单链表初始化**/
void InitSList(SLinkNode *head)
{
if((*head=(SLinkNode)malloc(sizeof(SNode)))==NULL)
{
exit(-1);
}
(*head)->next=NULL;
}
/**单链表插入元素**/
int InsertSList(SLinkNode head,int i,int elem)
{
SNode *pnew,*p;
p=head;
int j=0;
while(p->next!=NULL && j<i-1)
{
p=p->next;
j++;
}
if(j!=i-1)
{
printf("插入位置错误!");
return 0;
}
pnew=(SNode*)malloc(sizeof(SNode));
pnew->data=elem;
pnew->next=p->next;
p->next=pnew;
return 1;
}
/**核心--单链表元素去重**/
void DistinctElem(SLinkNode head)
{
SNode *p,*mark,*q;
for(mark=head->next;mark!=NULL;mark=mark->next)
{
q=mark;
p=mark->next;
while(p)
{
if(mark->data==p->data)
{
q->next=p->next;
free(p);
p=q->next;
}else
{
q=p;
p=p->next;
}
}
}
}
int main()
{
char arr[]={'A','B','A','E','B','E','A'};
SLinkNode list1;
//初始化带有头节点list1单链表
InitSList(&list1);
//插入元素
int i=1;
for(i;i<=sizeof(arr)/sizeof(char);i++)
{
if(InsertSList(list1,i,arr[i-1])==0)
{
printf("插入失败!");
return;
}
}
//输出单链表
SNode *p=list1;
while(p->next != NULL)
{
p=p->next;
printf("%c ",p->data);
}
printf("\n");
//单链表去重
DistinctElem(list1);
//输出单链表
SNode *p1=list1;
while(p1->next != NULL)
{
p1=p1->next;
printf("%c ",p1->data);
}
printf("\n");
return 0;
}