链串

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");
    }
}
none
最后修改于:2023年11月25日 18:31

评论已关闭