C_单链表去重

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

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值