王道p40 12.在一个递增有序的线性表中,有数值相同的元素存在。存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素

王道p40 12.在一个递增有序的线性表中,有数值相同的元素存在。
若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素,
例如(7,10,10,21,30,42,42,42,51,70)将变为(7,10,21,30,42,51,70)。

由于是有序表,所有相同值域的结点都是相邻的。用p扫描递增单链表L,若*p结点的值域等于其后继结点的值域,则删除后者,否则p移向下一个结点

本题代码如下

void deleterepeat(linklist* L)//删除重复的元素
{
	lnode* p = (*L)->next, * q;//p为扫描工作指针
	while (p->next!= NULL)
	{
		q = p->next;//q指向p的后继
		if (p->data == q->data)//如果p的后继与p相等
		{
			p->next = q->next;//p的后继就指向q的后继,也就是p的后继的后继
			free(q);//释放q结点
		}
		else
		{
			p = p->next;//p继续往后遍历
		}
	}
}

完整测试代码

#include
#include
typedef struct lnode
{
	int data;
	struct lnode* next;
}lnode,*linklist;
int n = 10;
int a[10] = { 7,10,10,21,30,42,42,42,51,70 };
void buildlinklist(linklist* L)
{
	*L = (lnode*)malloc(sizeof(lnode));
	(*L)->next = NULL;
	lnode* s = *L, * r = *L;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		s = (lnode*)malloc(sizeof(lnode));
		s->data = a[i];
		s->next = r->next;
		r->next = s;
		r = s;
	}
	r->next = NULL;
}
void deleterepeat(linklist* L)//删除重复的元素
{
	lnode* p = (*L)->next, * q;//p为扫描工作指针
	while (p->next!= NULL)
	{
		q = p->next;//q指向p的后继
		if (p->data == q->data)//如果p的后继与p相等
		{
			p->next = q->next;//p的后继就指向q的后继,也就是p的后继的后继
			free(q);//释放q结点
		}
		else
		{
			p = p->next;//p继续往后遍历
		}
	}
}
void print(linklist* L)//输出的单链表
{
	lnode* k = (*L)->next;
	while (k != NULL)
	{
		printf("%d ", k->data);
		k = k->next;
	}
}
int main()
{
	linklist L;
	buildlinklist(&L);
	printf("原单链表为:");
	print(&L);
	deleterepeat(&L);
	printf("\n修改后的链表为:");
	print(&L);
	return 0;
}

你可能感兴趣的:(王道课后习题单链表,算法,数据结构,c语言)