实现链串各种基本运算的算法

/**
*    实验题目:
*        实现链串各种基本运算的算法
*    实验目的:
*        领会链串存储结构和掌握链串中各种基本运算的算法设计
*    实验内容:
*        实现链串的各种基本运算
*        1、建立串s="abcdefghijklmn"和串s1="123"
*        2、输出串s
*        3、输出串s的长度
*        4、在串s的第9个字符位置插入串s1而产生串s2
*        5、输出串s2
*        6、删除串s第2个字符开始的5个字符而产生串s2
*        7、输出串s2
*        8、将串s第2个字符开始的5个字符替换成串s1而产生串s2
*        9、输出串s2
*        10、提取串s的第2个字符开始的10个字符而产生串s3
*        11、输出串s3
*        12、将串s1和串s2连接起来而产生串s4
*        13、输出串s4
*/

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>

typedef struct snode
{
    char data; // 数据域
    struct snode *next; // 指针域
}LinkStrNode; // 声明链串结点类型

/*-----------------将字符串常量赋给串s--------------------*/
static void str_assign(LinkStrNode *&s, char cstr[])
{
    int index;
    LinkStrNode *p, *r;

    s = (LinkStrNode *)malloc(sizeof(LinkStrNode)); // 动态分配存储空间
    r = s; // r指向新建链串的尾结点

    for(index = 0; cstr[index] != '\0'; index++)
    {
        p = (LinkStrNode *)malloc(sizeof(LinkStrNode)); // 创建新的数据结点p
        p->data = cstr[index]; // 新数据结点p的数据域赋值
        r->next = p; // 尾插法建链表
        r = p; // r指向新建的数据结点p
    }
    r->next = NULL; // 尾结点的next域为空
}

/*-----------------销毁串--------------------*/
static void destroy_str(LinkStrNode *&s)
{
    LinkStrNode *pre = s; // pre指向链表头结点
    LinkStrNode *p = s->next; // p指向链表中的第一个数据结点

    while(p != NULL) // 扫描链串s
    {
        free(pre); // 释放pre结点
        // pre,p同步后移一个结点
        pre = p;
        p = p->next;
    }
    // 循环结束时,p为NULL,pre指向尾结点,释放它
    free(pre);
}

/*-----------------串复制--------------------*/
static void str_copy(LinkStrNode *&s, LinkStrNode *t) // 串t复制给串s
{
    LinkStrNode *p = t->next;
    LinkStrNode *q;
    LinkStrNode *r;

    s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    s->next = NULL;
    r = s; // r始终指向尾结点
    while(p != NULL) // 将t的所有结点复制到s
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值