数据结构实验3-串和数组

串的模式匹配运算

实验要求

编写一个程序,实现顺序串的各种模式匹配运算,并在此基础上设计主程序完成如下功能:
(1)建立目标串s=‘abcabcdabcdeabcdefabcdefg’和模式串t=‘abcdeabcdefab’;
(2)由模式串t求出next值和nextval值;
(3)采用KMP算法求t在s中的位置;

程序代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define nmax 100
int Index_KMP(char * S, char * T, int pos ,int next[])
{

    int i = pos; int j = 1;
    while(i<=S[0] && j<= T[0]){
        if(j == 0|| S[i] == T[j]){
            ++i;
            ++j;
        }else{
            j = next[j];
        }
    }
    if(j>T[0]) return i-T[0];
    else return 0;
}
void get_next(char * T, int next[])
{
    int i = 1; next[1] = 0;int j = 0;
    while(i < T[0]){
        if(j == 0|| T[i] == T[j]){
            ++i;
            ++j;
            next[i] = j;
        }
        else j = next[j];
    }
}
void get_nextval(char * T, int nextval[])
{
    int i = 1; nextval[1] = 0;int j = 0;
    while(i <T[0]){
        if(j == 0|| T[i] == T[j]){
            ++i;
            ++j;
            if(T[i] != T[j]) nextval[i] = j;
            else nextval[i] = nextval[j];
        }
        else j = nextval[j];
    }
}
void Paint()
{
    printf("|"); printf("     The Experiment Of String        ") ;printf("|\n");
    printf("|"); printf("                KMP                  ") ;printf("|\n");
    printf("|"); printf("        Author: Luo Peng Fei         ") ;printf("|\n");
    printf("|"); printf("          Date:2017/4/12             ") ;printf("|\n");
}
int main()
{
    freopen("in.txt","r",stdin);
    char S[nmax]="",T[nmax]="";
    Paint();
    int next[nmax+5],nextval[nmax+5];
    printf("|"); printf("          请输入目标串:             ") ;printf("|\n");
    scanf("%s",S+1);
    printf("|"); printf("          请输入模式串:             ") ;printf("|\n");
    scanf("%s",T+1);
    printf("|"); printf("        求得的next数组为             ") ;printf("|\n");
    S[0] = strlen(S+1);
    T[0] = strlen(T+1);
    get_next(T,next);
    for(int i = 1; i<=strlen(T+1);++i)
        printf("%d ",next[i]);
    printf("\n");
    printf("|"); printf("        求得的nextal数组为           ") ;printf("|\n");
    get_nextval(T,nextval);
    for(int i = 1; i<=strlen(T+1);++i)
        printf("%d ",nextval[i]);
    printf("\n");
    int index = Index_KMP(S,T,0,next);
    printf("|"); printf("        求得的KMP结果为              ") ;printf("|\n");
    printf("%d\n",index);
    printf("\n");
    return 0;
}

运行结果

采用freopen重定向输入

这里写图片描述

数据
这里写图片描述

数组的操作

实验要求

  1. 建立一个n*n的对称矩阵A;用动态分配的一维数组B对矩阵A进行压缩存储,输出矩阵A和一维数组B;
  2. 在B中查找对称矩阵A中第row行,第col列(下标从1开始)的元素,输出该元素值;
  3. 建立一个稀疏矩阵C,输入其行数,列数和非零元个数,用三元组顺序表存储该矩阵,并按矩阵形式输出稀疏矩阵B;
  4. 对稀疏矩阵C做快速转置运算得到矩阵D,并按矩阵形式输出转置后的矩阵D。

要求

  1. 矩阵元素相关信息要从终端输入;
  2. 在三元组顺序表中按行优先顺序存放非零元素;
  3. 具体的输入和输出格式不限;
  4. 算法要具有较好的健壮性,对错误操作要做适当处理。

程序代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define nmax 100
#define MAXSIZE 100
typedef int ElemType;
typedef int Status;
typedef struct {
    int i,j;
    ElemType e;
}Triple;
typedef struct {
    Triple data[MAXSIZE+1];
    int mu,nu,tu;
}TSMatrix;
int matrix[nmax][nmax];
void Init_Matrix(int n,int m)
{
    for(int i = 1; i<=n; ++i){
        for(int j = 1; j<=m; ++j){
            scanf("%d",&matrix[i][j]);
        }
    }
}
int * Compress_Matrix(int n)
{
    int* base = (int*)malloc(sizeof(int)*((n*(n+1)/2)));
    int k = 0;
    for(int i = 1 ;i<=n;++i){
        for(int j = 1; j<=i; ++j){
            base[k++] = matrix[i][j];
        }
    }
    return base;
}
void output(int n, int m)
{
    for(int i = 1; i<=n; ++i){
        for(int j = 1; j<=m; ++j){
            printf("%d ",matrix[i][j]);
        }
        printf("\n");
    }
}
void output_CompMatri(int n,int *base)
{
   for(int i = 0; i<n*(n+1)/2;++i)
        printf("%d ",base[i]);
   printf("\n");
}
void Paint()
{
    printf("|"); printf("     The Experiment Of Array         ") ;printf("|\n");
    printf("|"); printf("         Array  &  Matrix            ") ;printf("|\n");
    printf("|"); printf("        Author: Luo Peng Fei         ") ;printf("|\n");
    printf("|"); printf("          Date:2017/4/12             ") ;printf("|\n");
}
int find_item(int *base)
{
    int i,j;
    scanf("%d%d",&i,&j);
    int ans = i*(i-1)/2 +j -1;
    return base[ans];
}
void input_TSM(int temp[][MAXSIZE],TSMatrix &M)
{
    int x ,y,ele;
    for(int i = 1; i<=M.tu;++i){
        scanf("%d %d %d",&x,&y,&ele);
        M.data[i].i = x;
        M.data[i].j = y;
        M.data[i].e = ele;
        temp[x][y] = ele;
    }
}
void output_TSM(int temp[][MAXSIZE],TSMatrix &M)
{
    for(int i = 1; i<=M.mu;++i){
        for(int j = 1; j<=M.nu;++j){
            printf("%2d ",temp[i][j]);
        }
        printf("\n");
    }
}
Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T)
{
    T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;
    int num[MAXSIZE],cpot[MAXSIZE];
    if(T.tu){
        for(int col = 1; col<=M.nu;++col){
            num[col] = 0;
        }
        for(int t = 1; t<=M.mu;++t){
            ++num[M.data[t].j];
        }
        cpot[1] = 1;
        for(int col = 2;col<=M.mu;++col){
            cpot[col] = cpot[col-1]+ num[col-1];
        }
        for(int p = 1;p <=M.tu;++p){
            int col = M.data[p].j, q = cpot[col];
            T.data[q].i = M.data[p].j;
            T.data[q].j = M.data[p].i;
            T.data[q].e = M.data[p].e;
            ++cpot[col];
        }
    }
    return OK;
}
void get(int temp[][MAXSIZE],TSMatrix &M)
{
    int x ,y,ele;
    for(int i = 1; i<=M.tu;++i){;
        x = M.data[i].i;
        y = M.data[i].j;
        ele = M.data[i].e;
        temp[x][y] = ele;
    }
}
int main()
{
    int n;
    TSMatrix M,T;
    printf("|"); printf("         请输入对称矩阵的大小              ") ;printf("|\n");
    scanf("%d",&n);
    if(n<=0){printf("矩阵大小错误!\n");exit(0);}
    printf("|"); printf("         请按行输入此对称矩阵              ") ;printf("|\n");
    Init_Matrix(n,n);
    printf("|"); printf("           对称矩阵的信息为                ") ;printf("|\n");
    output(n,n);
    printf("|"); printf("         对称矩阵的压缩结果为               ") ;printf("|\n");
    int * base = Compress_Matrix(n);
    output_CompMatri(n,base);
    printf("|"); printf("         请输入要查询的行和列              ") ;printf("|\n");
    printf("%d\n",find_item(base));
    printf("|"); printf("     请依次输入稀疏矩阵的行数,列数和非零元个数   ") ;printf("|\n");
    scanf("%d %d %d",&M.mu,&M.nu,&M.tu);
    int temp[MAXSIZE][MAXSIZE];memset(temp,0,sizeof(temp));
    printf("|"); printf("     请依次输入稀疏矩阵的%d个元素   ",M.tu) ;printf("|\n");
    input_TSM(temp,M);
    printf("|"); printf("           稀疏矩阵的信息为                ") ;printf("|\n");
    output_TSM(temp,M);
    printf("|"); printf("          转置后矩阵的信息为               ") ;printf("|\n");
    FastTransposeSMatrix(M,T);
    memset(temp,0,sizeof(temp));
    get(temp,T);
    output_TSM(temp,T);
    return 0;
}

运行结果

采用freopen重定向输入

这里写图片描述

数据
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值