首页 > 其他分享 >线性表之单链表(下)

线性表之单链表(下)

时间:2023-09-22 15:23:02浏览次数:40  
标签:链表 单链 线性表 list next linklist NULL data

话不多说,只要写了几个线性表的操作,其中包括:表的反转,表的相邻节点间data的最大值,以及2个链表按照顺序大小合并



// 头文件:link_list.h
typedef int data_t;

typedef struct node{
    data_t data;
    struct node *next;
}listnode, *linklist;

// 倒置链表
int list_reverse(linklist H);
// 相邻节点之间的最大值
linklist list_adjmax(linklist H, data_t *value);
// 2个链表按照顺序大小合并
int list_merge(linklist H1, linklist H2);
// link_list.c

# include <stdio.h>
# include <stdlib.h>
# include "link_list.h"
// 链表倒置
int list_reverse(linklist H){
	linklist p;
	linklist q;

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

	if (H->next == NULL || H->next->next == NULL){ // 只有一个节点
		return 0;
	}
	p == H->next->next;
	H->next->next == NULL;

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

		q->next = H->next; // 将第n个链表的尾部将第一个链表的头部相连
		H->next = q; // 第n个链表的头和H相连
	}
	return 0;
}

// 链表相邻节点之间data的和取最大值
linklist list_adjmax(linklist H, data_t *value){
	linklist p, q, r;
	data_t sum;

	if (H == NULL){
		printf("H is NULL\n");
		return NULL;
	}
	if (H->next == NULL || H->next->next == NULL || H->next->next->next == NULL){ // 只有2个链表情况
		return H;
	}
	q = H->next;
	p = H->next->next;
	sum = q->data + p->data;

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

		if (sum < q->data + p->data){
			sum = q->data + p->data;
			r = q;
		}
	}
	*value = sum;  // *指针表示,指针的某个空间的值
	return r;
	
}


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

标签:链表,单链,线性表,list,next,linklist,NULL,data
From: https://www.cnblogs.com/dack-zt-deng/p/17722457.html

相关文章

  • 线性表有哪几类?
    1.数组:最常用。数组的增删改查算法复杂度如何度量?时间上来衡量。 数组的排序复杂度?......
  • 9.19单链表带哨兵和双向链表带哨兵
    1.单链表publicclassMain{publicstaticvoidmain(String[]args){LNodeL=newLNode();L.addFirst(4);//头插L.addFirst(3);L.addFirst(2);L.addFirst(1);L.addLast(5);//尾插L.Isempty();//判空L.......
  • 第二章 线性表-单链表
    线性表2.5.1单链表的定义和表示存储结构(物理位置)可以不连续。(非顺序映像/链式映像)typedefstructLNode{ ElemTypedata;//数据域 structLNode*next;//指针域}LNode,*LinkList;//(同一结构体指针类型起了两个名称)//LinkList是指向结构体LNode的指针类型//如......
  • 线性表之单链表(上)
    单链表就是一个表结构最后存储的位置是下一个表结构的地址,一般通过p->next表示存储的下一个位置的地址//link_list.htypedefintdata_t;typedefstructnode{data_tdata;structnode*next;}listnode,*linklist;linklistlist_create();intlist_tail_inser......
  • 第二章 线性表
    线性表2.5.3循环链表最后一个结点的指针域指向头结点终止条件:p!=L&&p->next!=L循环链表的合并:设立尾指针。将第一个表的尾指针指向第二个表的第一个结点,第二个表的尾指针指向第一个表的头结点,然后释放第二个表的头结点。时间复杂度是O(1)2.5.4双向链表克服了单链表......
  • 王道数据结构:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先
    题目:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的排序方法是()A.先按k1进行直接插入排序,再按k2进行简单选择排序B.先按k2进行直接插入排序,再按k1进行简......
  • 9.15单链表无哨兵java实现
    publicclassMain{publicstaticvoidmain(String[]args){LNodeL=newLNode();System.out.println(L.number());L.Isempty();L.addFirst(4);//头插L.addFirst(3);L.addFirst(2);L.addFirst(1);L.a......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • 线性表——链式存储
    单链表(有头结点)#include<stdlib.h>//定义typedefstructLNode{intdata;//数据域structLNode*next;//指针域指向下一个结点,所以是structLNode类型}LNode,*LinkList;//*LinkList用于表示这是一个指向structLNode类型的指针//初始......
  • C数据结构-线性表之顺序表
    什么是线性表线性表的插入元素线性表的删除元素线性表顺序存储的缺点线性表的特点1.线性表的实例首先我们创建3个文件,分别如下:liner_data--sqlist.c--sqlist.h--test.csqlist.h//.h文件中定位数据的结构以及函数的方法typedefintdata_t;#defineN128......