//线性表的使用及函数定义 #include<stdio.h> #include<malloc.h> #define _CRT_SECURE_NO_WARNINGS_ #define OK 2 #define ERROR -1 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define Status int//用数值返回状态,状态值如上所示。 #define ElemType char//串一半都是字符串。 #define InitSize 100 #define IncreaseSize 10 typedef struct str { ElemType* base; int Alllen; int CurLen; }String; Status StrAssign(String& S) { S.base = (ElemType*)malloc(InitSize * sizeof(ElemType)); S.Alllen = InitSize; S.CurLen = 0; }//只是定义了一个空包,没有往里边放数值,这个得到时候去问一下老师,或者去查一下 int StrLen(String& S) { return S.CurLen; } Status StrCopy(String& S, String T) { S.base = (ElemType*)realloc(S.base, T.Alllen * sizeof(ElemType)); if (!S.base) return OVERFLOW; for (int i = 0; i < T.CurLen; i++)S.base[i] = T.base[i]; S.CurLen = T.CurLen; S.Alllen = T.Alllen; return OK; }//将T串全部复制到S串里边。 Status StrEmpty(String& S) { if (S.CurLen = 0) return TRUE; else return FALSE; }//判断串是否为空,如果串是空的,返回真,反之返回假 Status max(int a, int b) { if (a < b) return b; else return a; }//取a,b之中更大的一项返回 int StrCamp(String S, String T) { if (S.CurLen > T.CurLen) return 1; if (S.CurLen < T.CurLen) return -1; if (S.CurLen == T.CurLen) { int flag = 1; int i = 0; while (flag&&i<=max(S.CurLen,T.CurLen)) { if (S.base[i] == T.base[i]) flag = flag; else flag = 0; i++; } if (i == max(S.CurLen, T.CurLen)) return 0; else { if (S.base[i] > T.base[i]) return 1; else return -1; } } }//比较:先比较长度,如果长度相等,判断第一个不相等字符的大小。S>T 1;S<T -1 Status ClearStr(String& S) { S.CurLen = 0; S.Alllen = InitSize; free(S.base); S.base = (ElemType*)malloc(InitSize * sizeof(ElemType)); if (!S.base) return OVERFLOW; return OK; }//清除所有的串之中元素。这里使用的重新分配元素。 Status Strcat(String& S, String& T) { if (S.Alllen < S.CurLen + T.CurLen) { S.base = (ElemType*)realloc(S.base,(S.CurLen + S.CurLen+5) * sizeof(ElemType)); if (!S.base) return OVERFLOW; S.Alllen = S.CurLen + T.CurLen; }//如果放不下了,就重新分配 for (int i = 0; i < T.CurLen; i++) S.base[S.CurLen + i] = T.base[i]; S.CurLen = S.CurLen + T.CurLen; return OK; }//将T链接到S之后,并且返回S。 int Index(String& S, String& T, int *pos) { return *pos; }//这个之后会专门写一篇文章,在模式识别里边。包括朴素的模式识别算法和KMP算法 Status DestoryString(String& S) { free(S.base); return OK; }//销毁 Status StrInsert(String& S,int i, ElemType e) { if (S.CurLen == S.Alllen) { S.base = (ElemType*)realloc(S.base, (S.Alllen + IncreaseSize) * sizeof(ElemType)); if (!S.base) return OVERFLOW; S.Alllen = S.Alllen + IncreaseSize; }//满串增加长度 S.base[S.CurLen - 1] = e; return OK; } Status StrDelete(String& S, int i, ElemType* E) { for (int j = i - 1; j < S.CurLen; j++) S.base[j] = S.base[j + 1]; S.CurLen--; return OK; }//删除第i的元素 int main() { return 0; }