2020.4.30-数据结构

稀疏矩阵的转置

已知用三元组顺序表存储的稀疏矩阵ma,求这个矩阵的转置mb
输入要求
第一行输入三个整数mu, nu, tu,分别代表输入矩阵ma的行数、列数和非零元素的个数(0<mu<=1000000, 0<nu<=1000000, 0<=tu<=10)
接下来的tu行,每行输入一个三元组。
数据按行的升序输入,相同行的数据按列的升序输入。见样例输入。
6 7 8
1 2 12
1 3 9
3 1 -3
3 6 14
4 3 24
5 2 18
6 1 15
6 4 -1
输出要求
转置矩阵mb的三元组顺序表。

数据按行的升序输出,相同行的数据按列的升序输数。见样例输出。
7 6 8
1 3 -3
1 6 15
2 1 12
2 5 18
3 1 9
3 4 24
4 6 -1
6 3 14
用冒泡排序
代码

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
typedef struct{
    int i;//矩形行数
    int j;//矩形列数
    int e;//该区域值
}Rectangle;
void transfer(Rectangle ma[],Rectangle mb[]){
    for(int i = 1;i < ma[0].e;i++){
        for(int j = 1;j <= ma[0].e-i;j++){
            if(ma[j].j > ma[j+1].j){
                Rectangle temp = ma[j];
                ma[j] = ma[j+1];
                ma[j+1] = temp;
            }
        }
    }
    for(int i = 1;i < ma[0].e;i++){
        for(int j = 1;j <= ma[0].e-i;j++){
            if(ma[j].j == ma[j+1].j && ma[j].i > ma[j+1].i){
                Rectangle temp = ma[j];
                ma[j] = ma[j+1];
                ma[j+1] = temp;
            }
        }
    }
    mb[0].e = ma[0].e;mb[0].i = ma[0].j;mb[0].j = ma[0].i;
    for(int i = 1;i <= mb[0].e;i++){
        mb[i].i = ma[i].j;
        mb[i].j = ma[i].i;
        mb[i].e = ma[i].e;
    }
}
void createRectangle(Rectangle ma[]){
    for(int i = 1;i <= ma[0].e;i++){
        scanf("%d %d %d",&ma[i].i,&ma[i].j,&ma[i].e);
    }
}
int main(){
    Rectangle ma[MAXSIZE];
    Rectangle mb[MAXSIZE];
    scanf("%d %d %d",&ma[0].i,&ma[0].j,&ma[0].e);
    createRectangle(ma);
    transfer(ma,mb);
    for(int i = 0;i <= ma[0].e;i++){
        printf("%d %d %d\n",mb[i].i,mb[i].j,mb[i].e);
    }
}

字符串匹配-KMP算法

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXS 80
typedef struct{
    char *ch;
    int length;
} HString; // 堆式顺序存储
void createString(HString &S){
    S.ch = new char[MAXS];
    gets(S.ch+1);
    S.length = strlen(S.ch+1);
}
// 使用 KMP 算法进行模式匹配,字符比较次数
int charCompKMP(HString S, HString T){
	// 使用 KMP 算法进行模式匹配,字符比较次数 
int charCompKMP(HString S, HString T){
	//当前位置的最长前缀
	int t = 0;
	int count = 0;
	int j = 1;
	int next[T.length+1];
	//next记录的当前不匹配时返回比较主串的位置
	next[1] = 0;
	//计算next[]
	while(j < T.length){
		/*如果最长前缀的后一位和当前位置相等,说明可以更新最长前缀,t=0时说明当前被对比的字符已经与对比的字符串中第一个对比过了,并且还是不匹配,所以此时都往后退一个*/
		if(t == 0 || T.ch[t] == T.ch[j]){
			next[j+1] = t+1;
			t++;
			j++;
		}
		//否则,跟kmp匹配原理一样,找next前缀
		else{
			t = next[t];
		}
	}
	for(int i = 1,j = 1;i <= S.length && j <= T.length;){
		count++;
		if(j == 0 || S.ch[i] == T.ch[j]){
			if(j == 0) count--;
			i++;
			j++;
		}else{
			j = next[j];
		}
		if(j == T.length+1) break;
		
	}
	return count;
}
int main(){
    HString S, T;
    createString(S);
    createString(T);
    int num = charCompKMP(S, T);
    printf("%d", num);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值