数据结构C语言学习D6

这篇博客详细介绍了单链表的三种复杂操作:链表反转,找到相邻节点值之和最大的第一个节点,以及合并两个递增有序的链表。通过图解和代码实现,阐述了每一步的操作逻辑,加深了对链表操作的理解。文章强调了节点结构体的定义和操作,并提供了完整的C语言实现代码示例。
摘要由CSDN通过智能技术生成


前言

提示:本节主要讲单链表的复杂操作,这些内容均为个人学习笔记,理解有限请勿当作参考

学习了,基本的增、删、改、查,及malloc / free 的配对使用,本节学习了更为复杂的单链表操作例如合并两个有序单链表。


提示:以下是本篇笔记正文内容,下面案例均来源于老师课堂

一、链表反转

反转链表,又可以称为翻转或逆置链表。
算法思路:依次取原链表中各结点,将其作为新链表首结点插入H结点之后

1.图解步骤

算法过程

2.节点的struct结构体类型(自定义数据类型)

代码如下(示例过程只放出关键代码并不完整代码知悉):

#include <stdio.h>
#include <stdlib.h>

// this is linked list node template
typedef int MY_DATA;
typedef struct Link{
    MY_DATA elem;
    struct Link * next;
}link,*sgllink;

3.创建一个节点node

代码如下(一个node):

// @ create linked list and initialization
sgllink initElem(){
    sgllink t = (sgllink)malloc(sizeof(link));

    if(t == NULL){
        printf("malloc is penny pincher!");
        return t;
    }

    t->elem = 0;
    t->next = NULL;

    return t;
}

4.反转

代码如下 (反转过程,在你建好链表的前提下)

// @ reversal list elements
int revElem(sgllink t){
   sgllink q, p = t->next->next;
   t->next->next = NULL;
   
   if(!p){
       printf("Noting!!!");
       return 0;
   }

   while(p){
       q = p;
       p = p->next;

       q->next = t->next;
       t->next = q;
   }
   return 0;
}

二、求相邻两个节点值之和为最大的第一个结点指针

算法思路:设p,q 分别为链表中相邻两结点指针,求p->data+q->data为最大的那一组值,返回其相应的指针p即可

1.图解

过程描术

2.找

代码如下(前面步骤相同,直接上正餐)

	// @ adj tow elem sub Max
	sgllink adjTowElem(sgllink t){
	    sgllink i, j, k;
	    int sum;
	   
	    if(t == NULL) return NULL;
	    if(t->next == NULL){
	        printf("insingnificance!");
	        return t;
	    }
	
	    printf("1\n");
	    i = t->next;
	    j = t->next->next;
	    k = i;
	    sum = i->elem + j->elem;
	    printf("%d\n",sum);
	    while(j->next != NULL){
	        printf("2");
	        i = i->next;
	        j = j->next;
	        if(sum < i->elem + j->elem){
	            sum = i->elem + j->elem;
	            k = i;
	        }
	    }
	    return k;
	}

三、将递增有序的A和B合并成一个表A

算法思路:设指针p、q分别指向表A和B中的结点,若p->data ≤q->data则p结点进入结果表,否则q结点进入结果表。

1.图解

算法描述

2.合并

代码如下(老师的代码)

	int list_merge(linklist H1, linklist H2) {
	linklist p, q, r;

	if (H1 == NULL || H2 == NULL) {
		printf("H1 || H2 is NULL\n");
		return -1;
	}

	p = H1->next;
	q = H2->next;
	r = H1;
	H1->next = NULL;
	H2->next = NULL;

	while (p && q) {
		if (p->data <= q->data) {
			r->next = p;
			p = p->next;
			r = r->next;
			r->next = NULL;
		} else {
			r ->next = q;
			q = q->next;
			r = r->next;
			r->next = NULL;
		}
	}

	if (p == NULL) {
		r->next = q;
	}else {
		r->next = p;
	}

	return 0;
}

总结

通过本节课学到的对链表操作的方法,让我展开了一些想想,使得链表操作更灵活,对单链表的认识更深刻。
弄清楚 node 所包含的两个部分非常重要: 数据|指针 两部分组成一个节点(node),存放在自定的struct 类型中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值