数据结构(c语言版)(第三版)实验4(部分)

1. 实验目的(结出本次实验所涉及并要求掌握的知识点)

1.掌握栈的结构及基本运算的实现方法。
2.掌握用栈实现表达式计算的基本技术。
3.掌握应用栈进行问题求解的基本方法。
4.理解掌握串的有关概念和运算实现。
5.掌握快速模式匹配等串的典型算法。

**2.**实验内容(结出实验内容具体描述)

**实验1:**利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能。

**实验 4:**已知字符串采用带结点的链式存储结构(详见linksrting.h文件),

请编写函数linkstring substring(linkstring s,int i,int len),

在字符串s中从第i个位置起取长度为len的子串,函数返回子串链表。

**实验5:**字符串采用带头结点的链表存储,设计算法函数void delstring(linkstring s, int i,int len)

在字符串s中删除从第i个位置开始,长度为len的子串。

**实验6:**字符串采用带头结点的链表存储,编写函数linkstring index(linkstring s, linkstring t),

查找子串t在主串s中第一次出现的位置,若匹配不成功,则返回NULL。

**3.**算法描述及实验步骤(用适当的形式表达算法设计思想与算法实现步骤)

实验1:

**思路:**根据十进制转十六进制的规则进行转换,但要转换为字符串进行打印

/*
利用顺序栈结构,编写算法函数void Dto16(unsigned int m)实现十进制无符号整数m到十六进制数的转换功能。
*/
/**********************************/
/*文件名称:lab4_01.c                 */
/**********************************/
#include "seqstack.h"
/*请将本函数补充完整,并进行测试*/
void Dto16(int m)
{   seqstack s;			/*定义顺序栈*/
    init(&s);
    printf("十进制数%u对应的十六进制数是:",m);
    char a[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'} ;
    while (m)
    {
		push(&s,a[m%16]);
		m=m/16;
    }
    while (!empty(&s)){
        putchar(read(&s));
        pop(&s);
	}
    printf("\n");
}
int main()
{    int m;
     printf("请输入待转换的十进制数:\n");
     scanf("%u",&m);
     Dto16(m);
     return 0;
}

实验4:

**思路:**找到第i个位置并记录下这之前前一个的位置和该位置,再找到第i+len个位置。创建一个新的带头结点从第i个位置开始链接到第i+len个位置作为一个新链表返回,原链表通过记录的第i个位置的前一个的位置,连接到第i+len后一个位置保证原链表没断开。

/*
已知字符串采用带结点的链式存储结构(详见linksrting.h文件),
请编写函数linkstring substring(linkstring s,int i,int len),
在字符串s中从第i个位置起取长度为len的子串,函数返回子串链表。
*/

#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
linkstring substring(linkstring  s, int i, int len)
{	linkstring  p=s;
	while(i--){
		p=p->next;
	}
	linkstring  head=(linkstring)malloc(sizeof(linkstring)); 
	linkstring  q=(linkstring)malloc(sizeof(linkstring)); 
	head->next=q;
	while(len--){
		linkstring  qq=(linkstring)malloc(sizeof(linkstring)); 
		q->data=p->data;
		p=p->next;
		q->next=qq;
		q=qq;
	}
	q->next=NULL;
	return head;
}
int main()
{   linkstring str1,str2;
    str1=creat();                  /*建字符串链表*/
    print(str1);
    str2=substring(str1,3,5);    /*测试,从第3个位置开始取长度为5的子串,请自行构造不同测试用例*/
    print(str2);                   /*输出子串*/
    delList(str1);
    delList(str2);
    return 0;
}

实验五:

**思路:**首先要找到第i个结点位置,并边找边记录下该结点的前一个结点位置,若i为1,则要记录下头结点位置。然后进行删除操作。

若i<1,没有第小于1的结点,则错误。

/*
字符串采用带头结点的链表存储,设计算法函数void delstring(linkstring s, int i,int len)
在字符串s中删除从第i个位置开始,长度为len的子串。
*/
/**********************************/
/*文件名称:lab4_05.c                 */
/**********************************/
#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
void delstring(linkstring  s, int i, int len)
{
	linkstring  p=s;
	i--;
	while(i--){
		p=p->next;
	}
	linkstring  q=p->next;
	linkstring  pre=p;
	while(len--){
		pre=q;
		q=q->next; 
		free(pre);
	} 
	p->next=q;
	 
}
int main()
{   linkstring str;
    str=creat();            /*建字符串链表*/
    print(str);
    delstring(str,2,3);     /*测试,从第2个位置删除长度为3的子串,请自行构造不同的测试用例  */
    print(str);               /*输出*/
    delList(str);
    return 0;
}

实验6:

**思路:**从主串开始从第一个位置开始判断是否与字串匹配,若不匹配从主串的下一个位置开始匹配,同时字串回到第一个位置。

/*
字符串采用带头结点的链表存储,编写函数linkstring index(linkstring s, linkstring t),
查找子串t在主串s中第一次出现的位置,若匹配不成功,则返回NULL。
*/

#include "linkstring.h"
/*请将本函数补充完整,并进行测试*/
linkstring index(linkstring  s, linkstring t)
{
	linkstring  p=s;
	linkstring  q=t;
	while(p){
		p=p->next;
		q=t->next;
		while(p){
			linkstring pp=p;
			while(q&&pp&&pp->data==q->data){
				pp=pp->next;
				q=q->next;
			}
			if(!q){
				return p;
			}
			else{
				break;
			}
					
		}
	}
	return NULL;
}
int main()
{   linkstring s,t,p=NULL;
    s=creat();                  /*建立主串链表*/
    t=creat();			        /*建立子串链表*/
    print(s);
    print(t);
    p=index(s,t);
    if(p)
            printf("匹配成功,首次匹配成功的位置结点值为%c\n",p->data);
    else
            printf("匹配不成功!\n");
    delList(s);
    delList(t);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fanlangke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值