《数据结构》将一个带头结点的单链表分解成两个单链表

2024-02-16 10:58

本文主要是介绍《数据结构》将一个带头结点的单链表分解成两个单链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将一个带头结点的单链表分解成两个单链表

题目描述:

/*
设计一个算法,将一个带头结点的单链表分解成两个具有相同结构的
链表B和C,其中B白哦的结点为A中小于0的结点,C表的结点为A中大于0 的结点,
要求B和C 仍利用A表的结点。 (A表的元素都是非0元素)
*/

 

算法思想:‘

假设原来的链表是LA,将LA,分解成LB和LC,首先需要生成两个头结点,LB和LC;设置三个指针*pa,*pb,*pc,初始时,pa指向LA的第一个结点,pb指向LB的头结点,pc指向LC的头结点;然后遍历LA,当pa->data>0时,就将pa指向的结点插入到LB的后面,即pb->next=pa,然后让pb指向该结点,即pb=pb->next,指针pa后移pa=pa->next,表LB最后一个结点的指针域置空。当pa->data<0时,就将pa指向的结点插入到LC的后面,即pc->next=pa,然后让pc指向该结点,即pc=pc->next,指针pa后移pa=pa->next,表LC最后一个结点的指针域置空。

描述如下:

 

void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){struct LNode *pa,*pb,*pc;pa=LA->next;LB=new LNode;LC=new LNode;//要生成两个新的头结点!!! //LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么?? pb=LB;pc=LC;struct LNode *p;p=pa;while(pa){if(pa->data>0){pb->next=pa;pa=pa->next;pb=pb->next;pb->next=NULL;}else if(pa->data<0){pc->next=pa;pa=pa->next;pc=pc->next;pc->next=NULL;}}
}

 

 

 

实现:

 

/*
设计一个算法,将一个带头结点的单链表分解成两个具有相同结构的
链表B和C,其中B白哦的结点为A中小于0的结点,C表的结点为A中大于0 的结点,
要求B和C 仍利用A表的结点。 (A表的元素都是非0元素)
*/
#include<stdio.h>
#define MAX 100typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;int InitList(LinkList &L){L=new LNode;L->next=NULL;return 1;
} int ListLength(LinkList L){int length=0;struct LNode *p;p=L->next;while(p){++length;p=p->next;}return length;
}void TraveList(LinkList L){struct LNode *p;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");
}void CreateList(LinkList &L,int n){L=new LNode;L->next=NULL;struct LNode *p;p=L;for(int i=0;i<n;i++){struct LNode *s;s=new LNode;printf("请输入%d个结点的值:",i+1);scanf("%d",&s->data);s->next=NULL;p->next=s;p=s;}
}void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){struct LNode *pa,*pb,*pc;pa=LA->next;LB=new LNode;LC=new LNode;//要生成两个新的头结点!!! //LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么?? pb=LB;pc=LC;struct LNode *p;p=pa;while(pa){if(pa->data>0){pb->next=pa;pa=pa->next;pb=pb->next;pb->next=NULL;}else if(pa->data<0){pc->next=pa;pa=pa->next;pc=pc->next;pc->next=NULL;}}
}int main(){LinkList LA,LB,LC;if(LinkList(LA)){printf("LA初始化成功!\n");}else{printf("LA初始化失败!\n");}if(LinkList(LB)){printf("LB初始化成功!\n");}else{printf("LB初始化失败!\n");}if(LinkList(LC)){printf("LC初始化成功!\n");}else{printf("LC初始化失败!\n");}printf("请输入LA的长度:");int n1;scanf("%d",&n1);CreateList(LA,n1);TraveList(LA);Resolve(LA,LB,LC);TraveList(LB);TraveList(LC);return 0;
}


 

 

//修改一下,上面那个main方法里写的有问题,我们这里把初始化的InitList()方法用上,将新的链表LB和LC的初始化工作使用InitList()里进行:


 

#include<stdio.h>
#define MAX 100typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;int InitList(LinkList &L){L=new LNode;L->next=NULL;return 1;
} int ListLength(LinkList L){int length=0;struct LNode *p;p=L->next;while(p){++length;p=p->next;}return length;
}void TraveList(LinkList L){struct LNode *p;p=L->next;while(p){printf("%d ",p->data);p=p->next;}printf("\n");
}void CreateList(LinkList &L,int n){L=new LNode;L->next=NULL;struct LNode *p;p=L;for(int i=0;i<n;i++){struct LNode *s;s=new LNode;printf("请输入%d个结点的值:",i+1);scanf("%d",&s->data);s->next=NULL;p->next=s;p=s;}
}void Resolve(LinkList &LA,LinkList &LB,LinkList &LC){struct LNode *pa,*pb,*pc;pa=LA->next;//LB=new LNode;//LC=new LNode;//要生成两个新的头结点!!! //LB=LC=LA;//不能这样写,这样写最后输出的LB和LChi一样的表,居然会一样??为什么?? pb=LB;pc=LC;while(pa){if(pa->data>0){pb->next=pa;pa=pa->next;pb=pb->next;pb->next=NULL;}else if(pa->data<0){pc->next=pa;pa=pa->next;pc=pc->next;pc->next=NULL;}}
}int main(){LinkList LA,LB,LC;if(InitList(LA)){printf("LA初始化成功!\n");}else{printf("LA初始化失败!\n");}if(InitList(LB)){printf("LB初始化成功!\n");}else{printf("LB初始化失败!\n");}if(InitList(LC)){printf("LC初始化成功!\n");}else{printf("LC初始化失败!\n");}printf("请输入LA的长度:");int n1;scanf("%d",&n1);CreateList(LA,n1);if(ListLength(LA)>0){printf("输出链表A:");}TraveList(LA);Resolve(LA,LB,LC);if(ListLength(LB)>0){printf("输出链表B:");} TraveList(LB);if(ListLength(LC)>0){printf("输出链表C:");} TraveList(LC);return 0;
}

 

 

 

这篇关于《数据结构》将一个带头结点的单链表分解成两个单链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/714325

相关文章

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

Go语言构建单链表

package mainimport "fmt"type ListNode struct {Val intNext *ListNode}func main() {list := []int{2,4,3}head := &ListNode{Val:list[0]}tail := head //需要头尾两个指针for i:=1;i<len(list);i++ {//方法一 数组直接构建链表tai

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变的有序集合,可以存放任意类型的数据。列表中的元素可以通过索

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。