数据结构某考研题目(手撕代码)

在这里插入图片描述
这道题就是对单链表去重,主要考查的是单链表删除和遍历操作,删除单链表的结点必须知道前驱是谁
思路
1.定义三个结构体指针,指针一用来指向第一个结点,指针二指向第一个结点,指针三指向第二个结点,如果第二个结点与第一个结点重复,则删除指针三所指的结点;不重复则依次移动二,三指针,重复以上操作。
2.遍历完一遍单链表之后,再将指针一移动到下一个位置,重复以上操作
3.注意尾结点的特殊情况

#include <stdio.h>
#include <stdlib.h>
typedef struct linklist{
	int data;
	struct linklist *next;
}LNode,*link;
int ListLength(link L)
{
    link p=L;int sum=0;
    while(p)
    {
     sum++;
     p=p->next;
    }
    return sum-1;//去除头结点
}
int abs(int a){
	if(a>=0) return a;
	return(a*(-1));
} 
void update(link HEAD){
	link p=HEAD;
	int len=ListLength(HEAD);//不包括头指针 
	link q;link r; 
	for(int i=1;i<=len-1;i++){
		p=p->next;//记录一个data,开始遍历链表 
		int t=p->data;
		r=p;
		q=r->next;
		while(1){
			if(abs(t)==abs(q->data)){//abs()为取绝对值函数 
				//如果q为尾结点
				if(q->next==NULL){
					r->next=NULL;
					free(q);
				}else{
						r->next=q->next;
						free(q);//释放掉删除的结点 
						q=r->next;
				}
				len--;
			}
			if(r->next==NULL||(q->next==NULL&&abs(t)!=abs(q->data))) break;
			if(abs(t)!=abs(q->data)){
				r=r->next;
				q=q->next;
			}
		}
	}
}
void PrintList(link L)
{
	link p=L;//link p=L->next;//跳过头结点
    if(ListLength(L))
    {
        printf("当前单链表所有元素:");
        while(p)
        {
            printf("%d ",p->data);
            p=p->next;
        }
        printf("\n");
    }
    else
    {
        printf("当前单链表已空!\n");
    }
}
int main()
{
	LNode HEAD,a,b,c,d,e;
	HEAD.next=&a;
	a.data=21;
	b.data=15;
	c.data=15;
	d.data=-7;
	e.data=15;
	a.next=&b;
	b.next=&c;
	c.next=&d;
	d.next=&e;
	e.next=NULL;
	printf("原单链表元素为:21,15,15,-7,15\n");
	update(HEAD.next);
	PrintList(HEAD.next);
	return 0;
}

运行结果为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值