我仔细看了下Flier给出的字符串演示程序的代码,觉得之间漏了很多很多"{","}",而且看上去并不像Flier本人写出的代码,由于修改代码过于繁琐,我重新写了一份,顺便练习一下我最近自学的链表。。。。 <源代码> #include <stdio.h> #include <math.h> #include <conio.h> #include <malloc.h> #include <ctype.h>
#define TRUE 1 #define FALSE 0
#define MAX_CMD_COUNT 4 #define MAX_STRING_LEN 255
typedef unsigned char BOOL;
struct strlst { char *strname; char *content; struct strlst *nextAddr; struct strlst *prevAddr; };
struct strlst *node_head; struct strlst *node_tail; struct strlst *node_curr;
BOOL isnumeric(char *); /* 测试该串是否仅包含数字 */ int strlen(char *); /* 去串长度 */ int strtoint(char *); /* 将串转换为整数 */ BOOL equal(char *,char *); /* 测试两串是否相等 */ char *mid(char *,char *,int,int); /* 模仿VB中的Mid函数取子串 */ int strcmp(char *,char *); /* 比较两字符串,返回第一次出现的位置 */ char *strcpy(char *,char *); /* 复制串 */ char *inverse(char *); /* 将一个串逆转 */ char *substr(char *,char *,int,int); /* 在指定范围取子串 */ char *convert(char *,char [][MAX_STRING_LEN],int); /* 将一个指定行的二位数组转换成指针 */ char *lowercase(char *); /* 将指定串转换成小写 */
struct strlst *cmd_create(char *,char *); /* 创建一个串变量结构,返回结构指针 */ struct strlst *cmd_searchbyname(char *); /* 通过串名查找一个串变量结构,返回结构指针 */ struct strlst *cmd_searchbycont(char *); /* 通过串内容查找一个串变量结构,返回结构指针 */ void display(struct strlst *); /* 输出单个串变量结构 */ void dispall(); /* 输出整条链表 */ void addtolst(struct strlst *); /* 将一个串变量结构添加至链表 */ void delbyname(char *); /* 通过串名删除链表中的指定串变量结构 */ void delbycont(char *); /* 通过串内容删除链表中的指定串变量结构 */ void total(); /* 统计链表占用的内存数 */ void freeall(); /* 释放整条链表 */ void locate(int); /* 将当前指针指向指定链表位置 */ void cmd(char *); /* 执行命令 */
int main() { char *command; command=(char *)malloc(MAX_STRING_LEN*sizeof(char)); if(!command) { printf("Cannot allocate memory!\n"); exit(1); } printf("String operating demo version 0.1\n"); printf("Created by yuki\n\n"); while(1) { printf("CMD>"); gets(command); cmd(command); } return 1; }
BOOL isnumeric(char *s) { if(!s) return FALSE; while(*s) if(!isdigit(*s++)) return FALSE; return TRUE; }
int strlen(char *s) { int result=0; if(!s) return 0; while(*s++) result++; return result; } int strtoint(char *s) { int sl=strlen(s)-1; int result=0; if(!s||!isnumeric(s)) return -1; while(*s) { result+=(*s-'0')*(int)(pow(10.0,(double)(sl--))); s++; } return result; }
BOOL equal(char *s1,char *s2) { if(!s1||!s2) return FALSE; if(strlen(s1)!=strlen(s2)) return FALSE; while(*s1) if(*s1++!=*s2++) return FALSE; return TRUE; }
char *mid(char *des,char *src,int begin,int length) { char *p=des; if(!src||begin>strlen(src)||begin+length-1>strlen(src)) return NULL; src+=begin-1; while(length--) *des++=*src++; *des='\0'; return p; }
int strcmp(char *s1,char *s2) { char *p,*bakup=s2; BOOL flag; int slen1=strlen(s1),slen2=strlen(s2); int i=1; if(!s1||!s2||!slen1||!slen2) return 0; if(slen1>slen2) { p=(char*)malloc((slen2+1)*sizeof(char)); if(!p) { printf("Cannot allocate memory!\n"); exit(1); } while(i<=slen1) { p=mid(p,s1,i,slen2); if(!p) {free(p); return 0;} flag=TRUE; while(*p) { if(*p++!=*s2++) { flag=FALSE; s2=bakup; break; } } if(flag) {free(p); return i;} i++; } return 0; } else if(slen1==slen2) { if(equal(s1,s2)) return 1; return 0; } else return 0; }
char *strcpy(char *des,char *src) { if(!src) return NULL; char *p=des; while(*des++=*src++); *des='\0'; return p; }
char *inverse(char *s) { if(!s) return NULL; char *p=s; char temp; char *sbegin=s,*send=s+strlen(s)-1; while(sbegin<=send) { temp=*sbegin; *sbegin=*send; *send=temp; sbegin++; send--; } return p; }
char *substr(char *des,char *src,int begin,int end) { if(!src) return NULL; if(begin<1||end>strlen(src)||begin>end) return NULL; char *p=des,*eAddr; eAddr=src+end-1; src+=begin-1; while(src<=eAddr) *des++=*src++; *des='\0'; return p; }
char *convert(char *des,char src[][MAX_STRING_LEN],int row) { char *p=des; int i=0; while(src[row][i]) *des++=src[row][i++]; *des='\0'; return p; }
char *lowercase(char *s) { char *p=s; if(!s) return NULL; while(*s) { if(*s>='A'&&*s<='Z') *s=*s+32; s++; } return p; }
struct strlst *cmd_create(char *name,char *content) { struct strlst *p; p=(struct strlst *)malloc(sizeof(struct strlst)); if(!p) { printf("Cannot allocate for structure!\n"); exit(1); } p->strname=name; p->content=content; p->nextAddr=NULL; p->prevAddr=NULL; return p; }
struct strlst *cmd_searchbyname(char *name) { struct strlst *p; p=node_head; while(p) { if(strcmp(p->strname,name)) {node_curr=p; return p;} p=p->nextAddr; } return NULL; }
struct strlst *cmd_searchbycont(char *content) { struct strlst *p; p=node_head; while(p) { if(strcmp(p->content,content)) {node_curr=p; return p;} p=p->nextAddr; } return NULL; }
void display(struct strlst *s) { printf("Varible name of string : %s\n",s->strname); printf("Varible content : %s\n",s->content); }
void dispall() { struct strlst *p; p=node_head; if(!p) printf("The list is empty!\n"); else { printf("String name Content\n"); while(p) { printf("%4s %12s\n",p->strname,p->content); p=p->nextAddr; } } }
void addtolst(struct strlst *s) { if(!node_head) /* 如果表头为空的,则将结构添加至表头 */ { node_head=s; /* 注意:首先使用cmd_create()函数创建结构 */ node_tail=node_head; node_curr=node_head; } else /* 否则在链表尾部添加新的结构 */ { s->prevAddr=node_tail; node_tail->nextAddr=s; node_tail=s; /* 将链表尾巴移到新添加的结构体地址上 */ node_curr=node_tail; } }
void delbyname(char *name) { struct strlst *p=cmd_searchbyname(name); if(!p) printf("No such varible structure can be got rid of!\n"); else { struct strlst *bakup,*waste=p; if(!p->nextAddr&&!p->prevAddr) { node_head=NULL; node_tail=NULL; node_curr=NULL; } else if(p==node_head) { node_head=node_head->nextAddr; node_head->prevAddr=NULL; node_curr=node_head; } else if(p==node_tail) { node_tail=node_tail->prevAddr; node_tail->nextAddr=NULL; node_curr=node_tail; } else if(p->prevAddr&&p->nextAddr) { bakup=p->prevAddr; /* 备份当前节点的前一个地址 */ p=p->nextAddr; /* 当前位置后移一个节点 */ p->prevAddr=bakup; /* 将新位置的前一个地址设为备份位置,这样就断开了和欲删除地址处的连接 */ bakup->nextAddr=p; /* 同样将备份位置的后一个地址和后移后的节点地址相连 */ node_curr=p; } printf("Varible %s is deleted!\n",waste->strname); free(waste); } }
void delbycont(char *content) { struct strlst *p=cmd_searchbycont(content); if(!p) printf("No such varible structure can be got rid of!\n"); else { struct strlst *bakup,*waste=p; if(!p->nextAddr&&!p->prevAddr) { node_head=NULL; node_tail=NULL; node_curr=NULL; } else if(p==node_head) { node_head=node_head->nextAddr; node_head->prevAddr=NULL; node_curr=node_head; } else if(p==node_tail) { node_tail=node_tail->prevAddr; node_tail->nextAddr=NULL; node_curr=node_tail; } else if(p->prevAddr&&p->nextAddr) { bakup=p->prevAddr; /* 备份当前节点的前一个地址 */ p=p->nextAddr; /* 当前位置后移一个节点 */ p->prevAddr=bakup; /* 将新位置的前一个地址设为备份位置,这样就断开了和欲删除地址处的连接 */ bakup->nextAddr=p; /* 同样将备份位置的后一个地址和后移后的节点地址相连 */ node_curr=p; } printf("Varible %s is deleted!\n",waste->strname); free(waste); } }
void total() { long sum=0,count=0; struct strlst *p; p=node_head; while(p) { sum+=sizeof(p); count++; p=p->nextAddr; } printf("Total %ld structure(s) found in the linked list!\n",count); printf("Total %ld byte(s) memory have been allocated!\n",sum); }
void freeall() { struct strlst *p,*bak; p=node_head; while(p) { bak=p->nextAddr; free(p); p=bak; } }
void locate(int pos) { struct strlst *p; if(pos<1) printf("Impossible to locate the position which is illegal!\n"); else { p=node_head; while(p) { if(!pos) {node_curr=p; break;} p=p->nextAddr; } } }