1. 程式人生 > >第八週 【專案2

第八週 【專案2

/*  

*Copyright  (c)2017,煙臺大學計算機與控制工程學院      

*All rights reservrd.      

*作者:趙楷文 

*完成時間:2017年12月14日      

*版本號:v1.0 

*問題描述:

定義鏈串的儲存結構,實現串的基本運算,並完成測試。 

一、liString.h

#ifndef LISTRING_H_INCLUDED
#define LISTRING_H_INCLUDED

typedef struct snode
{
    char data;
    struct snode *next;
} LiString;

void StrAssign(LiString *&s,char cstr[]);   //字串常量cstr賦給串s
void StrCopy(LiString *&s,LiString *t); //串t複製給串s
bool StrEqual(LiString *s,LiString *t); //判串相等
int StrLength(LiString *s); //求串長
LiString *Concat(LiString *s,LiString *t);  //串連線
LiString *SubStr(LiString *s,int i,int j);  //求子串
LiString *InsStr(LiString *s,int i,LiString *t) ;   //串插入
LiString *DelStr(LiString *s,int i,int j);  //串刪去
LiString *RepStr(LiString *s,int i,int j,LiString *t);  //串替換
void DispStr(LiString *s);  //輸出串

#endif // LISTRING_H_INCLUDED

二、liString.cpp
#include <stdio.h>
#include <malloc.h>
#include "liString.h"

void StrAssign(LiString *&s,char cstr[])    //字串常量cstr賦給串s
{
    int i;
    LiString *r,*p;
    s=(LiString *)malloc(sizeof(LiString));
    r=s;                        //r始終指向尾節點
    for (i=0;cstr[i]!='\0';i++)
    {   p=(LiString *)malloc(sizeof(LiString));
        p->data=cstr[i];
        r->next=p;r=p;
    }
    r->next=NULL;
}
void StrCopy(LiString *&s,LiString *t)  //串t複製給串s
{
    LiString *p=t->next,*q,*r;
    s=(LiString *)malloc(sizeof(LiString));
    r=s;                //r始終指向尾節點
    while (p!=NULL)     //將t的所有節點複製到s
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
}
bool StrEqual(LiString *s,LiString *t)  //判串相等
{
    LiString *p=s->next,*q=t->next;
    while (p!=NULL && q!=NULL && p->data==q->data)
    {   p=p->next;
        q=q->next;
    }
    if (p==NULL && q==NULL)
        return true;
    else
        return false;
}
int StrLength(LiString *s)  //求串長
{
    int i=0;
    LiString *p=s->next;
    while (p!=NULL)
    {   i++;
        p=p->next;
    }
    return i;
}
LiString *Concat(LiString *s,LiString *t)   //串連線
{
    LiString *str,*p=s->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    r=str;
    while (p!=NULL)         //將s的所有節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    p=t->next;
    while (p!=NULL)         //將t的所有節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}
LiString *SubStr(LiString *s,int i,int j)   //求子串
{
    int k;
    LiString *str,*p=s->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    str->next=NULL;
    r=str;                      //r指向新建連結串列的尾節點
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
        return str;             //引數不正確時返回空串
    for (k=0;k<i-1;k++)
        p=p->next;
    for (k=1;k<=j;k++)          //將s的第i個節點開始的j個節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}
LiString *InsStr(LiString *s,int i,LiString *t)     //串插入
{
    int k;
    LiString *str,*p=s->next,*p1=t->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    str->next=NULL;
    r=str;                              //r指向新建連結串列的尾節點
    if (i<=0 || i>StrLength(s)+1)       //引數不正確時返回空串
        return str;
    for (k=1;k<i;k++)                   //將s的前i個節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    while (p1!=NULL)                    //將t的所有節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p1->data;
        r->next=q;r=q;
        p1=p1->next;
    }
    while (p!=NULL)                     //將*p及其後的節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}
LiString *DelStr(LiString *s,int i,int j)   //串刪去
{
    int k;
    LiString *str,*p=s->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    str->next=NULL;
    r=str;                      //r指向新建連結串列的尾節點
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
        return str;             //引數不正確時返回空串
    for (k=0;k<i-1;k++)         //將s的前i-1個節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    for (k=0;k<j;k++)               //讓p沿next跳j個節點
        p=p->next;
    while (p!=NULL)                 //將*p及其後的節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}
LiString *RepStr(LiString *s,int i,int j,LiString *t)   //串替換
{
    int k;
    LiString *str,*p=s->next,*p1=t->next,*q,*r;
    str=(LiString *)malloc(sizeof(LiString));
    str->next=NULL;
    r=str;                          //r指向新建連結串列的尾節點
    if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
        return str;                 //引數不正確時返回空串
    for (k=0;k<i-1;k++)             //將s的前i-1個節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;q->next=NULL;
        r->next=q;r=q;
        p=p->next;
    }
    for (k=0;k<j;k++)               //讓p沿next跳j個節點
        p=p->next;
    while (p1!=NULL)                //將t的所有節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p1->data;q->next=NULL;
        r->next=q;r=q;
        p1=p1->next;
    }
    while (p!=NULL)                 //將*p及其後的節點複製到str
    {   q=(LiString *)malloc(sizeof(LiString));
        q->data=p->data;q->next=NULL;
        r->next=q;r=q;
        p=p->next;
    }
    r->next=NULL;
    return str;
}
void DispStr(LiString *s)   //輸出串
{
    LiString *p=s->next;
    while (p!=NULL)
    {   printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}
三、main.cpp
#include <stdio.h>
#include "liString.h"
int main()
{
    LiString *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,3);
    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;
}


程式測試: