线性链表的分割

news/2024/7/3 6:38:37

1.内容:已知一个线性链表表示的线性表中含有三类字符的数据元素(如字母字符,数字字符和其它字符),试编写算法将该线性链表分割为三个循环链表,其中每个循环链表表示的线性表中均只含有一类字符。

2.算法分析

   首先建立三个只有头结点的单循环链表,分别是数字链表LA,字母链表LB,其他字符链表LC,然后,依次从以及链表中读取结点,如果结点的值域为数字,则将其插入到数字单循环链表中,如果结点的值域为字母,则将其插入到字母单循环链表中,如果结点的值域为其它字符,则将其插入到其他字符的单循环链表中,最后,设置每个链表的最后一个结点的指针域,使其指向头结点。

3.概要设计

使用C语言,其中设置了以下函数

程序的运行流程图如下所示:

 4.程序运行结果:

 源码如下:

// 声明单链表结构体
struct LNode {
	char data;//定义数据类型为字符型
	struct LNode *next;
};
LNode * createList() {
	LNode *head;
	LNode *p1,*p2;
	p1=p2=(LNode *)malloc(sizeof(LNode));//分配空间 
	head=(LNode *)malloc(sizeof(LNode));
	scanf("%c",&p1->data);
	int i=0;
	while(p1->data!='0') {   //当用户输入测试数据时,输入0,默认一组数据输入结束 
		i+=1;
		if(i==1) {
			head->next=p1;
		} else {
			p2->next=p1;
		}
		p2=p1;
		p1=(LNode *)malloc(sizeof(LNode));
		scanf("%c",&p1->data);
	}
	p2->next=NULL;
	return head;
}
//打印单链表 
void printList(LNode *list) {
	LNode *temp=list->next;//定义头结点 
	printf("\n");
	while(temp!=NULL) {  //循环单链表
		printf("%c",temp->data); //输出单链表中的data数据
		temp=temp->next; // 遍历至下一个结点
	}
	printf("\n");
}
//将单链表中的各种字符分割开来 
void separate(LNode *&LA,LNode *&LB,LNode *&LC) {
	//原始的单链表是LA,分割后的三个单链表是LA(数字字符)、LB(字母字符)、LC(其他字符)
	LNode *pa,*pb,*pc;
	LNode *p=LA->next;//原始链表遍历指针 
	pa=LA;
	pb=LB=(LNode*)malloc(sizeof(LNode));//分配空间 
	pc=LC=(LNode*)malloc(sizeof(LNode));
	// 指针pa,pb,pc分别是三个新链表的尾指针,初始时指向各表头结点
	while(p!=NULL) {
		if(p->data>='0'&&p->data<='9') { //数字字符,链入数字链LA 
			pa->next=p;
			pa=p;
		} else if(p->data>='a'&&p->data<='z'||p->data>='A'&&p->data<='Z') { //字母字符,链入字母链LB 
			pb->next=p;
			pb=p;
		} else { //其他字符,链人其他字符链LC 
			pc->next=p;
			pc=p;
		}
		p=p->next;
	}
	//使链表最后一个结点的指针域指向头结点 
	pa->next=p;
	pb->next=p;
	pc->next=p;
}
int main() {
	LNode *LA,*LB,*LC;
	LA=createList();//建立测试链表
	printList(LA);//输出单链表 
	separate(LA,LB,LC);
	printList(LA);
	printList(LB);
	printList(LC);
	return 0;
}

 


http://www.niftyadmin.cn/n/2249226.html

相关文章

十进制整数转换为任意进制数

内容: 将十进制整数num转换为r进制数&#xff0c;其转换方法为辗转相除法。要求用链栈实现。 步骤&#xff1a; 算法分析 本题需要将十进制整数num转换为任意进制数&#xff0c;要求使用链栈实现转换。程序中设计了四个函数&#xff0c;(1)函数InitStack()用来初始化一个顺序…

scala 编译机制 反编译案例

目录scala底层的编译机制源码类反编译class文件得到的demo01_test反编译class文件得到的demo01_test$反编译class文件得到的Workerscala底层的编译机制 源码类 package com.xcu.chapter06object demo01_test {def main(args: Array[String]): Unit {var worker new Worker…

回溯算法之八皇后问题

内容: 皇后问题是一个古老而著名的问题&#xff0c;是回溯算法的典型问题&#xff0c;该问题是19世纪著名的数学家高斯于1850年提出的&#xff1a; 在8*8格的国际象棋棋盘上&#xff0c;安放八个皇后&#xff0c;要求没有一个皇后能够“吃掉”任何其他一个皇后&#xff0c;即…

ProgressWheelDialogUtil【ProgressWheel Material样式进度条对话框】

版权声明&#xff1a;本文为HaiyuKing原创文章&#xff0c;转载请注明出处&#xff01; 前言 简单封装网络请求时的加载对话框以及上传、下载文件的进度加载对话框。 效果图 代码分析 ProgressWheel &#xff1a; 自定义view&#xff0c;仿Material Design样式 ProgressWheelDi…

判断一个字符串是否为回文序列

内容: 回文是指正读反读均相同的字符序列&#xff0c;如"abba"和"abdba"均是回文&#xff0c;但"good"不是回文。试写一个算法判定给定的字符向量是否为回文。 步骤&#xff1a; 算法分析 本算法利用数组和栈实现&#xff0c;其主要思路为将从…

a18_scala 抽象类

目录scala outline抽象类简介代码示意scala outline scala outline 抽象类简介 抽象类一般由抽象属性以及抽象方法配合使用&#xff0c;目的是为了让设计者把控架构 抽象属性&#xff1a; 属性只有声明&#xff0c;但是没有赋值 抽象方法&#xff1a; 方法只有声明&#x…

Git Extension操作技巧

2019独角兽企业重金招聘Python工程师标准>>> 1、如果看不到远程刚刚新建的分支&#xff0c;可以先pull下。 2、如果master要想和某个分支合并&#xff0c;看不到时&#xff0c;可以尝试显示所有分支 3、kdiff3的冲突解决时会出现一个什么base文件&#xff0c;看不懂…

队列置空队、判空、入队出队

内容: 假设以带头结点的循环链表表示队列&#xff0c;并且只设一个指针指向队尾元素节点(注意不设头结点)&#xff0c;试编写相应的置空队、判队空、入队和出队等算法。 步骤&#xff1a; 算法分析 本题是循环链表基本操作的扩展&#xff0c;题中设有一个指针指向队尾元素的…