严蔚敏 数据结构习题 C语言 4.10~4.13

来源:互联网 发布:ppt软件学习 编辑:程序博客网 时间:2024/06/05 04:54

今天忙了一大堆的事后,脑子突然短路了,各种小问题找了N久,现在感觉要爆肝了,比看到听到某人自称宝宝更不好(°ο°)~@ 晕倒了..
不多说,上代码~

#include <iostream>#include <stdlib.h>#include <math.h>#include <string.h>#include <stdio.h>using namespace std;#define ok 1#define error 0#define true 1#define  false 0#define overflow -1//#define stack_init_size 100//#define stack_increment 10typedef int status;#define maxsize 255typedef char sstring[maxsize + 1];status sassign(sstring &s, char *ch){        int i = 0;        char *p = ch;        while (i < maxsize && *p)        {                s[++i] = *p++;        }        s[0] = i;        if (*p)        {                return error;        }        else        {                return ok;        }}void strassign(sstring &T, sstring S){        int i;        for (i = 0; i <= S[0]; i++)        {                T[i] = S[i];        }}void strcpy(sstring &t, sstring s){        int i;        for (i = 0; i <= s[0]; i++)        {                t[i] = s[i];        }}int strcompare(sstring s, sstring t){        int i = 1;        while (i <= s[0] && i <= t[0] && s[i] == t[i])        {                i++;        }        if (i <= s[0])                if (i <= t[0])                {                        return s[i] - t[i];                }                else                {                        return  s[i];                }        else if (i <= t[0])        {                return -t[i];        }        else        {                return  0;        }}status concat(sstring &t, sstring s1, sstring s2){        int i, j;        for (i = 1; i <= s1[0]; i++)        {                t[i] = s1[i];        }        if (s1[0] + s2[0] <= maxsize)        {                for (j = 1; j <= s2[0]; j++)                {                        t[i++] = s2[j];                }                t[0] = s1[0] + s2[0];                return ok;        }        else        {                for (j = 1; j <= maxsize - s1[0]; j++)                {                        t[i++] = s2[j];                }                t[0] = maxsize;                return error;        }}status substring(sstring &sub, sstring s, int pos, int len){        int i;        if (pos < 1 || pos > s[0] || len < 0 || len > s[0] - pos + 1)        {                return error;        }        for (i = 1; i <= len; i++)        {                sub[i] = s[pos + i - 1];        }        sub[0] = len;        return ok;}void putdata(sstring s){        int i;        printf("\n");        for (i = 1; i <= s[0]; i++)        {                printf("%c", s[i]);        }}/*4.10*/void strreverse(sstring &s, sstring r) //求r的逆s{        int i;        sstring a, b, c;        strassign(s, "");        for (i = r[0]; i > 0; i--)        {                substring(a, r, i, 1);                strassign(b, a);                concat(c, s, b);                strassign(s, c);        }}/*4.11*/int ak[maxsize];int substract(sstring s, sstring t, sstring &r){        int i, j = 1, k = 1,q=1;        sstring a, b, d,e;        memset(ak, -1, sizeof(a));        sstring c;        sassign(a, " ");        sassign(b, " ");        sassign(c, " ");        sassign(d, " ");        for (i = 1; i <= s[0]; i++)        {                substring(c, s, i, 1);                substring(a, s, 1, 1);                for (j = 1; j < i && strcompare(c, a);) /*判s的当前字符c(其实是字符串)是否第一次出现*/                {                        j++;                        //printf("%d\n",j);                        substring(a, s, j, 1);                }                if (i == j)                {                        substring(b, t, 1, 1);                        for (k = 1; k <= t[0] && strcompare(c, b);)   /*是否在t中出现*/                        {                                k++;                                substring(b, t, k, 1);                        }                        if (k > t[0])                        {                                concat(d, r, c);                                strassign(r, d);                                //putdata(r);                                ak[q++]=j;                        }                }        }        //printf("%d",ak[q-1]);        q--;        return q;}/*4.12*/int Replace(sstring &s, sstring t, sstring v){        int n, i;        sstring head, tail, a, b;        sassign(b, "");        sassign(a, "");        sassign(head, "");        sassign(tail, "");        for (n = 0, i = 1; i <= s[0] - t[0] + 1; i++)        {                substring(a, s, i, t[0]);                if (!strcompare(a, t))                {                        substring(head, s, 1, i - 1);                        substring(tail, s, i + t[0], s[0] - t[0] - i + 1);                        concat(b, head, v);                        concat(s, b, tail);                        i += v[0];                        n++;                }        }        return n;}/*4.13*/int Delete(sstring &s, sstring t){        int n, i;        sstring head, tail, a, b;        sassign(b, "");        sassign(a, "");        sassign(head, "");        sassign(tail, "");        for (n = 0, i = 1; i <= s[0] - t[0] + 1; i++)        {                substring(a, s, i, t[0]);                if (!strcompare(a, t))                {                        substring(head, s, 1, i - 1);                        substring(tail, s, i + t[0], s[0] - t[0] - i + 1);                        concat(s, head, tail);                        n++;                }        }        return n;}int main(){        int o,p,q,i;        printf("**********************************************\n");        sstring r, s, v, k;        sstring a, b, c;        printf("4.10\n");        sassign(r, "I am a ACMer");        printf("原串:");        putdata(r);        strreverse(s, r);        printf("\n逆串:");        putdata(s);        printf("\n**********************************************\n");        printf("4.11\n");        sassign(k, "I am a ACMer");        printf("串1:");        putdata(k);        printf("\n串2:");        sassign(v, "ACMer");        putdata(v);        sassign(c, "");        printf("只在串1出现不在串2中的字符:");        o=substract(k, v, c);        putdata(c);        printf("\n各字符第一次出现的位置分别为:\n");        for(i=1;i<=o;i++)        {            printf("%d ",ak[i]);        }        printf("\n**********************************************\n");        printf("4.12\n");        printf("原串:");        putdata(r);        printf("\n将“ACMer”替换成“bird”");        sassign(a, "ACMer");        sassign(b, "bird");        printf("\n改变后:");        Replace(r, a, b);        putdata(r);        printf("\n**********************************************\n");        printf("4.13\n");        sassign(r, "I am a ACMer");        printf("原串:");        putdata(r);        printf("\n将“ACMer”删除");        sassign(a, "ACMer");        printf("\n改变后:");        Delete(r, a);        putdata(r);        printf("\n**********************************************\n");        return 0;}
0 0