1. 程式人生 > >資料結構之自建演算法庫——順序串

資料結構之自建演算法庫——順序串

按照“0207將演算法變程式”[視訊]部分建議的方法,建設自己的專業基礎設施演算法庫。

順序串演算法庫採用程式的多檔案組織形式,包括兩個檔案:

  1.標頭檔案:sqString.h,包含定義順序串資料結構的程式碼、巨集定義、要實現演算法的函式的宣告;

#ifndef SqString_H_INCLUDED
#define SqString_H_INCLUDED

#define MaxSize 100             //最多的字元個數
typedef struct
{   char data[MaxSize];         //定義可容納MaxSize個字元的空間
    int length;                 //標記當前實際串長
} SqString; void StrAssign(SqString &s,char cstr[]); //字串常量cstr賦給串s void StrCopy(SqString &s,SqString t); //串t複製給串s bool StrEqual(SqString s,SqString t); //判串相等 int StrLength(SqString s); //求串長 SqString Concat(SqString s,SqString t); //串連線 SqString SubStr(SqString s,int i,int j); //求子串 SqString InsStr(SqString s1,int
i,SqString s2); //串插入 SqString DelStr(SqString s,int i,int j) ; //串刪去 SqString RepStr(SqString s,int i,int j,SqString t); //串替換 void DispStr(SqString s); //輸出串 #endif // SqString_H_INCLUDED

  2.原始檔:sqString.cpp,包含實現各種演算法的函式的定義

#include <stdio.h>
#include <malloc.h>
#include "SqString.h"
void StrAssign(SqString &s,char cstr[]) //s為引用型引數 { int i; for (i=0;cstr[i]!='\0';i++) s.data[i]=cstr[i]; s.length=i; } void StrCopy(SqString &s,SqString t) //s為引用型引數 { int i; for (i=0;i<t.length;i++) s.data[i]=t.data[i]; s.length=t.length; } bool StrEqual(SqString s,SqString t) { bool same=true; int i; if (s.length!=t.length) //長度不相等時返回0 same=false; else for (i=0;i<s.length;i++) if (s.data[i]!=t.data[i]) //有一個對應字元不相同時返回0 { same=false; break; } return same; } int StrLength(SqString s) { return s.length; } SqString Concat(SqString s,SqString t) { SqString str; int i; str.length=s.length+t.length; for (i=0;i<s.length;i++) //將s.data[0..s.length-1]複製到str str.data[i]=s.data[i]; for (i=0;i<t.length;i++) //將t.data[0..t.length-1]複製到str str.data[s.length+i]=t.data[i]; return str; } SqString SubStr(SqString s,int i,int j) { SqString str; int k; str.length=0; if (i<=0 || i>s.length || j<0 || i+j-1>s.length) return str; //引數不正確時返回空串 for (k=i-1;k<i+j-1;k++) //將s.data[i..i+j]複製到str str.data[k-i+1]=s.data[k]; str.length=j; return str; } SqString InsStr(SqString s1,int i,SqString s2) { int j; SqString str; str.length=0; if (i<=0 || i>s1.length+1) //引數不正確時返回空串 return str; for (j=0;j<i-1;j++) //將s1.data[0..i-2]複製到str str.data[j]=s1.data[j]; for (j=0;j<s2.length;j++) //將s2.data[0..s2.length-1]複製到str str.data[i+j-1]=s2.data[j]; for (j=i-1;j<s1.length;j++) //將s1.data[i-1..s1.length-1]複製到str str.data[s2.length+j]=s1.data[j]; str.length=s1.length+s2.length; return str; } SqString DelStr(SqString s,int i,int j) { int k; SqString str; str.length=0; if (i<=0 || i>s.length || i+j>s.length+1) //引數不正確時返回空串 return str; for (k=0;k<i-1;k++) //將s.data[0..i-2]複製到str str.data[k]=s.data[k]; for (k=i+j-1;k<s.length;k++) //將s.data[i+j-1..s.length-1]複製到str str.data[k-j]=s.data[k]; str.length=s.length-j; return str; } SqString RepStr(SqString s,int i,int j,SqString t) { int k; SqString str; str.length=0; if (i<=0 || i>s.length || i+j-1>s.length) //引數不正確時返回空串 return str; for (k=0;k<i-1;k++) //將s.data[0..i-2]複製到str str.data[k]=s.data[k]; for (k=0;k<t.length;k++) //將t.data[0..t.length-1]複製到str str.data[i+k-1]=t.data[k]; for (k=i+j-1;k<s.length;k++) //將s.data[i+j-1..s.length-1]複製到str str.data[t.length+k-j]=s.data[k]; str.length=s.length-j+t.length; return str; } void DispStr(SqString s) { int i; if (s.length>0) { for (i=0;i<s.length;i++) printf("%c",s.data[i]); printf("\n"); } }

  3.在同一專案(project)中建立一個原始檔(如main.cpp),編制main函式,完成相關的測試工作。 例:

#include <stdio.h>
#include "sqString.h"
int main()
{
    SqString s,s1,s2,s3,s4;
    printf("鏈串的基本運算如下:\n");
    printf("  (1)建立串s和串s1\n");
    StrAssign(s,"abcdefghijklmn");
    printf("  (2)輸出串s:");
    DispStr(s);
    StrAssign(s1,"123");
    printf("  (2)輸出串s1:");
    DispStr(s1);
    printf("  (3)串s的長度:%d\n",StrLength(s));
    printf("  (4)在串s的第9個字元位置插入串s1而產生串s2\n");
    s2=InsStr(s,9,s1);
    printf("  (5)輸出串s2:");
    DispStr(s2);
    printf("  (6)刪除串s第2個字元開始的5個字元而產生串s2\n");
    s2=DelStr(s,2,5);
    printf("  (7)輸出串s2:");
    DispStr(s2);
    printf("  (8)將串s第2個字元開始的5個字元替換成串s1而產生串s2\n");
    s2=RepStr(s,2,5,s1);
    printf("  (9)輸出串s2:");
    DispStr(s2);
    printf("  (10)提取串s的第2個字元開始的10個字元而產生串s3\n");
    s3=SubStr(s,2,10);
    printf("  (11)輸出串s3:");
    DispStr(s3);
    printf("  (12)將串s1和串s2連線起來而產生串s4\n");
    s4=Concat(s1,s2);
    printf("  (13)輸出串s4:");
    DispStr(s4);
    return 0;
}