链串
warning:
这篇文章距离上次修改已过424天,其中的内容可能已经有所变动。
字符串大部分功能是操作多个节点,比数字麻烦。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stringsize 255
struct String{
char word;//字符域
struct String* next;//指针域
};//定义顺序串
String* createstring() {
String *S=(String*)malloc(sizeof(String));
S->next=NULL;
return S;
}//创建串
String* createnode(int value){
String *node=(String*)malloc(sizeof(String));
node->word=value;
node->next=NULL;
return node;
}//创建节点
void printstring(String *S){
String *smove=S->next;//创建游标
while(smove){
printf("%c",smove->word);
smove=smove->next;
}
printf("\n");
}//输出串
void inputstring(String *S){
char value;
String *smove,*node;//定义链串游标和链串节点
smove=S;
printf("请输入字符串(输入#结束):");
scanf(" %c",&value);
while(value!='#'){
node=createnode(value);//创建节点
smove->next=node;//设置尾节点next指针指向的下一个节点
smove=node;//移动游标
scanf("%c",&value);//以字符为单位循环输入
}
smove->next=NULL;//链串尾节点next指针指向空
}//输入串
void searchlength(String *S){
int length=0;
String *smove;
smove=S->next;
while(smove){
length++;
smove=smove->next;
}
printf("串的长度为%d\n",length);
}//返回串长度
void insertstring(String *S1){
int index;
printf("请输入子串需插入主串的位置:");
scanf("%d",&index);
int length=0;
String *smove;
smove=S1->next;
while(smove){
length++;
smove=smove->next;
}
if(index<0||index>length){
printf("输入下标越界,请重新输入\n");
return;
}
else{
String *S2=createstring();
inputstring(S2);
String *smove1=S1;//创建主串游标
String *smove2=S2;//创建子串游标
for(int i=0;i<=index;i++)//移动到插入位置
smove1=smove1->next;
while(smove2->next)//移动到子串尾节点
smove2=smove2->next;
smove2->next=smove1->next;
smove1->next=S2->next;//主串原插入位置节点的next指针指向子串的首元节点
}
}//插入串
void changestring(String *S){
String *smove=S;
int sindex,eindex;
printf("请输入要替换的开始位置和结束位置:");
scanf("%d %d",&sindex,&eindex);
for(int i=0;i<=sindex;i++)
smove=smove->next;
printf("请输入长度为%d的字符串:",eindex-sindex+1);
for(int i=sindex;i<=eindex;i++){
scanf(" %c",&smove->word);
smove=smove->next;
}
}//替换串
void comparestring1(String *S1){
String *S2=createstring();
inputstring(S2);
String *smove1=S1->next;//创建主串游标
String *smove2=S2->next;//创建子串游标
while(smove1&&smove2){//逐位比较Acsii码大小
if(smove1->word>smove2->word){
printf("S1字符串大于S2字符串\n");
return;
}
else if(smove1->word==smove2->word){
smove1=smove1->next;
smove2=smove2->next;
}
else{
printf("S1字符串小于S2字符串\n");
return;
}
}
if(smove1==NULL&&smove2==NULL)
printf("S1字符串等于S2字符串\n");
else if(smove1!=NULL)
printf("S1字符串大于S2字符串\n");
else
printf("S1字符串小于S2字符串\n");
}//按值比较串大小
void comparestring2(String *S1){
int length1=0;
String *smove1;
smove1=S1->next;
while(smove1){
length1++;
smove1=smove1->next;
}
String *S2=createstring();
inputstring(S2);
int length2=0;
String *smove2;
smove2=S2->next;
while(smove2){
length2++;
smove2=smove2->next;
}
if(length1>length2)
printf("S1字符串大于S2字符串\n");
else if(length1==length2)
printf("S1字符串等于S2字符串\n");
else
printf("S1字符串小于S2字符串\n");
}//按长度比较串大小
void clearstring(String *S){
if(S->next==NULL){
printf("串为空\n");
return;
}
else{
String *delectnode=S->next;//头插法删除节点为头结点指向的下一个节点
String *frontnode;
while(delectnode->next!=NULL){//遍历删除节点
frontnode=delectnode;
delectnode=delectnode->next;
free(frontnode);//释放当前节点
}
S->next=NULL;//此时串为空
printf("串已清空\n");
}
}//清空串
void destroystring(String *S){
clearstring(S);//先清空释放除头结点以外所有节点
free(S);//释放头结点
S=NULL;//将头结点设为NULL
printf("链表已销毁,程序自动结束运行\n");
exit(0);
}//销毁串
void stringmenu(){
printf("1.输出串\n");
printf("2.输入串\n");
printf("3.返回串长度\n");
printf("4.插入串\n");
printf("5.替换串\n");
printf("6.按值比较串大小\n");
printf("7.按长度比较串大小\n");
printf("8.清空串\n");
printf("9.销毁串\n");
printf("0.退出程序\n");
}//串功能菜单
void endsystem(String *S){
destroystring(S);
exit(0);
}//结束程序
int main(){
String *S=createstring();
int flag=1,sort;
while(flag){
stringmenu();
printf("请输入数字选择功能:");
scanf("%d",&sort);
switch(sort){
case 1:{
printstring(S);
break;
}
case 2:{
inputstring(S);
break;
}
case 3:{
searchlength(S);
break;
}
case 4:{
insertstring(S);
break;
}
case 5:{
changestring(S);
break;
}
case 6:{
comparestring1(S);
break;
}
case 7:{
comparestring2(S);
break;
}
case 8:{
clearstring(S);
break;
}
case 9:{
destroystring(S);
break;
}
case 0:{
endsystem(S);
break;
}
}
printf("\n");
}
}
评论已关闭