数据结构之---C语言实现串的块链存储表示

//c语言实现串的块链存储表示
//杨鑫
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CHUNKSIZE 80
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
char blank='#';
typedef int Status;
//定义块链存储的串的每个节点
typedef struct Chunk
{
		char ch[CHUNKSIZE];
		struct Chunk *next;
}Chunk;

//定义块链存储的串
typedef struct
{
	Chunk *head, *tail;
	int curlen;
}LString;

 void InitString(LString *T)
 {
   (*T).curlen=0;
   (*T).head=NULL;
   (*T).tail=NULL;
 }

 Status StrAssign(LString *T,char *chars)
 {
   int i,j,k,l;
   Chunk *p,*q;
   i=strlen(chars);
   if(!i||strchr(chars,blank))
     return ERROR;
   (*T).curlen=i;
   j=i/CHUNKSIZE;
   if(i%CHUNKSIZE)
     j++;
   for(k=0;k<j;k++)
   {
     p=(Chunk*)malloc(sizeof(Chunk));
     if(!p)
       return ERROR;
     if(k==0)
       (*T).head=q=p;
     else
     {
       q->next=p;
       q=p;
     }
     for(l=0;l<CHUNKSIZE&&*chars;l++)
       *(q->ch+l)=*chars++;
     if(!*chars)
     {
       (*T).tail=q;
       q->next=NULL;
       for(;l<CHUNKSIZE;l++)
         *(q->ch+l)=blank;
     }
   }
   return OK;
 }

 Status StrCopy(LString *T,LString S)
 {
   Chunk *h=S.head,*p,*q;
   (*T).curlen=S.curlen;
   if(h)
   {
     p=(*T).head=(Chunk*)malloc(sizeof(Chunk));
     *p=*h;
     h=h->next;
     while(h)
     {
       q=p;
       p=(Chunk*)malloc(sizeof(Chunk));
       q->next=p;
       *p=*h;
       h=h->next;
     }
     p->next=NULL;
     (*T).tail=p;
     return OK;
   }
   else
    return ERROR;
 }

 Status StrEmpty(LString S)
 {
   if(S.curlen)
     return FALSE;
   else
     return TRUE;
 }

 int StrCompare(LString S,LString T)
 {
   int i=0;
   Chunk *ps=S.head,*pt=T.head;
   int js=0,jt=0;
   while(i<S.curlen&&i<T.curlen)
   {
     i++;
     while(*(ps->ch+js)==blank)
     {
       js++;
       if(js==CHUNKSIZE)
       {
         ps=ps->next;
         js=0;
       }
     };
     while(*(pt->ch+jt)==blank)
     {
       jt++;
       if(jt==CHUNKSIZE)
       {
         pt=pt->next;
         jt=0;
       }
     };
     if(*(ps->ch+js)!=*(pt->ch+jt))
       return *(ps->ch+js)-*(pt->ch+jt);
     else
     {
       js++;
       if(js==CHUNKSIZE)
       {
         ps=ps->next;
         js=0;
       }
       jt++;
       if(jt==CHUNKSIZE)
       {
         pt=pt->next;
         jt=0;
       }
     }
   }
   return S.curlen-T.curlen;
 }

 int StrLength(LString S)
 {
   return S.curlen;
 }

 Status ClearString(LString *S)
 {
   Chunk *p,*q;
   p=(*S).head;
   while(p)
   {
     q=p->next;
     free(p);
     p=q;
   }
   (*S).head=NULL;
   (*S).tail=NULL;
   (*S).curlen=0;
   return OK;
 }

 Status Concat(LString *T,LString S1,LString S2)
 {
   LString a1,a2;
   InitString(&a1);
   InitString(&a2);
   StrCopy(&a1,S1);
   StrCopy(&a2,S2);
   (*T).curlen=S1.curlen+S2.curlen;
   (*T).head=a1.head;
   a1.tail->next=a2.head;
   (*T).tail=a2.tail;
   return OK;
 }

 Status SubString(LString *Sub, LString S,int pos,int len)
 {
   Chunk *p,*q;
   int i,k,n,flag=1;
   if(pos<1||pos>S.curlen||len<0||len>S.curlen-pos+1)
     return ERROR;
   n=len/CHUNKSIZE;
   if(len%CHUNKSIZE)
     n++;
   p=(Chunk*)malloc(sizeof(Chunk));
   (*Sub).head=p;
   for(i=1;i<n;i++)
   {
     q=(Chunk*)malloc(sizeof(Chunk));
     p->next=q;
     p=q;
   }
   p->next=NULL;
   (*Sub).tail=p;
   (*Sub).curlen=len;
   for(i=len%CHUNKSIZE;i<CHUNKSIZE;i++)
     *(p->ch+i)=blank;
   q=(*Sub).head;
   i=0;
   p=S.head;
   n=0;
   while(flag)
   {
     for(k=0;k<CHUNKSIZE;k++)
       if(*(p->ch+k)!=blank)
       {
         n++;
         if(n>=pos&&n<=pos+len-1)
         {
           if(i==CHUNKSIZE)
           {
             q=q->next;
             i=0;
           }
           *(q->ch+i)=*(p->ch+k);
           i++;
           if(n==pos+len-1)
           {
             flag=0;
             break;
           }
         }
       }
     p=p->next;
   }
   return OK;
 }

 int Index(LString S,LString T,int pos)
 {
   int i,n,m;
   LString sub;
   if(pos>=1&&pos<=StrLength(S))
   {
     n=StrLength(S);
     m=StrLength(T);
     i=pos;
     while(i<=n-m+1)
     {
       SubString(&sub,S,i,m);
       if(StrCompare(sub,T)!=0)
         ++i;
       else
         return i;
     }
   }
   return 0;
 }

 void Zip(LString *S)
 {
   int j,n=0;
   Chunk *h=(*S).head;
   char *q;
   q=(char*)malloc(((*S).curlen+1)*sizeof(char));
   while(h)
   {
     for(j=0;j<CHUNKSIZE;j++)
       if(*(h->ch+j)!=blank)
       {
         *(q+n)=*(h->ch+j);
         n++;
       }
     h=h->next;
   }
   *(q+n)=0;
   ClearString(S);
   StrAssign(S,q);
 }

 Status StrInsert(LString *S,int pos,LString T)
 {
   int i,j,k;
   Chunk *p,*q;
   LString t;
   if(pos<1||pos>StrLength(*S)+1)
     return ERROR;
   StrCopy(&t,T);
   Zip(S);
   i=(pos-1)/CHUNKSIZE;
   j=(pos-1)%CHUNKSIZE;
   p=(*S).head;
   if(pos==1)
   {
     t.tail->next=(*S).head;
     (*S).head=t.head;
   }
   else if(j==0)
   {
     for(k=1;k<i;k++)
       p=p->next;
     q=p->next;
     p->next=t.head;
     t.tail->next=q;
     if(q==NULL)
       (*S).tail=t.tail;
   }
   else
   {
     for(k=1;k<=i;k++)
       p=p->next;
     q=(Chunk*)malloc(sizeof(Chunk));
     for(i=0;i<j;i++)
       *(q->ch+i)=blank;
     for(i=j;i<CHUNKSIZE;i++)
     {
       *(q->ch+i)=*(p->ch+i);
       *(p->ch+i)=blank;
     }
     q->next=p->next;
     p->next=t.head;
     t.tail->next=q;
   }
   (*S).curlen+=t.curlen;
   Zip(S);
   return OK;
 }

 Status StrDelete(LString *S,int pos,int len)
 {
   int i=1;
   Chunk *p=(*S).head;
   int j=0;
   if(pos<1||pos>(*S).curlen-len+1||len<0)
     return ERROR;
   while(i<pos)
   {
     while(*(p->ch+j)==blank)
     {
       j++;
       if(j==CHUNKSIZE)
       {
         p=p->next;
         j=0;
       }
     }
     i++;
     j++;
     if(j==CHUNKSIZE)
     {
       p=p->next;
       j=0;
     }
   };
   while(i<pos+len)
   {
     while(*(p->ch+j)==blank)
     {
       j++;
       if(j==CHUNKSIZE)
       {
         p=p->next;
         j=0;
       }
     }
     *(p->ch+j)=blank;
     i++;
     j++;
     if(j==CHUNKSIZE)
     {
       p=p->next;
       j=0;
     }
   };
   (*S).curlen-=len;
   return OK;
 }

 Status Replace(LString *S,LString T,LString V)
 {
   int i=1;
   if(StrEmpty(T))
     return ERROR;
   do
   {
     i=Index(*S,T,i);
     if(i)
     {
       StrDelete(S,i,StrLength(T));
       StrInsert(S,i,V);
       i+=StrLength(V);
     }
   }while(i);
   return OK;
 }

 void StrPrint(LString T)
 {
   int i=0,j;
   Chunk *h;
   h=T.head;
   while(i<T.curlen)
   {
     for(j=0;j<CHUNKSIZE;j++)
       if(*(h->ch+j)!=blank)
       {
         printf("%c",*(h->ch+j));
         i++;
       }
     h=h->next;
   }
   printf("\n");
 }

 void DestroyString()
 {
 }

 int main()
 {
   char *s1="ABCDEFGHI", *s2="12345", *s3="", *s4="asd#tr", *s5="ABCD";
   Status k;
   int pos,len;
   LString t1,t2,t3,t4;
   InitString(&t1);
   InitString(&t2);
   printf("===============分隔符=========================\n");
   printf("初始化串t1后,串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1));
   k=StrAssign(&t1,s3);
   if(k==OK)
   {
     printf("串t1为: \n");
     StrPrint(t1);
   }
   else
     printf("出错\n");
   k=StrAssign(&t1,s4);
   if(k==OK)
   {
     printf("串t1为: \n");
     StrPrint(t1);
   }
   else
     printf("出错\n");
   k=StrAssign(&t1,s1);
   if(k==OK)
   {
     printf("串t1为: \n");
     StrPrint(t1);
   }
   else
     printf("出错\n");
   printf("串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1));
   StrAssign(&t2,s2);
   printf("串t2为: \n");
   StrPrint(t2);
   StrCopy(&t3,t1);
   printf("由串t1拷贝得到串t3,串t3为: \n");
   StrPrint(t3);
   InitString(&t4);
   StrAssign(&t4,s5);
   printf("串t4为: ");
   StrPrint(t4);
   Replace(&t3,t4,t2);
   printf("===============分隔符=========================\n");
   printf("用t2取代串t3中的t4串后,串t3为: \n");
   StrPrint(t3);
   ClearString(&t1);
   printf("===============分隔符=========================\n");
   printf("清空串t1后,串t1空否?%d(1:空 0:否) 串长=%d\n",StrEmpty(t1),StrLength(t1));
   Concat(&t1,t2,t3);
   printf("===============分隔符=========================\n");
   printf("串t1(=t2+t3)为: \n");
   StrPrint(t1);
   Zip(&t1);
   printf("去除不必要的占位符后,串t1为: \n");
   StrPrint(t1);
   pos=Index(t1,t3,1);
   printf("pos=%d\n",pos);
   printf("===============分隔符=========================\n");
   printf("在串t1的第pos个字符之前插入串t2,请输入pos: \n");
   scanf("%d",&pos);
   k=StrInsert(&t1,pos,t2);
   if(k)
   {
     printf("插入串t2后,串t1为: \n");
     StrPrint(t1);
   }
   else
     printf("插入失败!\n");
   return 0;
 }

时间: 2024-08-11 09:53:53

数据结构之---C语言实现串的块链存储表示的相关文章

javascript实现数据结构: 串的块链存储表示

和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个"结点大小"的问题,即每个结点可以存放一个字符,也可以存放多个字符. 下面是结点大小为4(即每个结点存放4个字符)的链表: head --> (a) --> (b) --> (c) --> ... --> (i) 当结点大小大于1时,由于串长不一定是结点大小的整倍数,则链表中的最后一个结点不一定全被串值占满,此时通常补上

4-3-串的块链存储结构-串-第4章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第4章  串 - 块链串 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h        相关测试数据下载  链接? 无数据       文档中源码

数据结构之---C语言实现广义表头尾链表存储表示

//广义表的头尾链表存储表示 //杨鑫 #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #define MAXSTRLEN 40 ) typedef char SString[MAXSTRLEN+1]; typedef char AtomType; // 定义原子类型为字符型 typedef enum{ ATOM, LIST // ATOM==0:原

数据结构之---C++语言实现图的十字链表存储表示

最近一直忙着考研复习,很久都没有更新博客了,今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstdio> #include <stdlib.h> #include <cstring> using namespace std; #define MAX_VERTEX_NUM 20 #define OVERFLOW -2 #define OK 1 typedef int Status

数据结构之---C语言实现图的邻接表存储表示

// 图的数组(邻接矩阵)存储表示 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 // 顶点字符串的最大长度+1 #define MAX_VERTEX_NUM 20 typedef int InfoType; // 存放网的权值 typedef char VertexType[MAX_NAME]; // 字符串类型 typedef enum{DG, DN, AG

数据结构之---C语言实现二叉树的三链表存储表示

//二叉树的三叉链表存储 //杨鑫 #include <stdio.h> #include <stdlib.h> #define max(a, b) a > b ? a : b #define ClearBiTree DestroyBiTree typedef char TElemType; // 二叉树的三叉链表存储表示 typedef struct BiTPNode { TElemType data; struct BiTPNode *parent,*lchild,*rc

数据结构(C实现)------- 串

字符串(简称串),可以将其看作是种特殊的线性表,其特殊性在于线性表的数据元素的类型总是字符性,字符串的数据对象红豆为字符集.    串是由0个或多个字符组成的有限序列.一般记作:s = "s1 s2 s3 .... sn",,其中,s是串名,用双引号括起来的字符序列称为串的值,si(1<=i <= n)称为串的元素,可以是字母,数字或其他字符,是构成串的基本单位,字符的个数n称为串的长度. 串中的几个术语: 1. 空串: 由0个字符组成的串称为空串,空串不包含任何字符,其长

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

数据结构(C语言版)-第4章 串、数组和广义表

补充:C语言中常用的串运算 调用标准库函数 #include<string.h> 串比较,strcmp(char s1,char s2) 串复制,strcpy(char to,char from)串连接,strcat(char to,char from) 求串长,strlen(char s) 4.1  串 串(String)----零个或多个字符组成的有限序列 串的存储结构:顺序存储.链式存储 顺序存储表示 typedef struct{ char *ch; //若串非空,则按串长分配存储区,