C语言版的数据结构(7)

2019-03-28 15:19

三、实习题

1. 写一个程序,将输入的十进制数据M 转换为八进制数据M8,将其调试通过。在此基础上修改程序,实现十进制数据M 向N 进制(2或8或16)的转换。 (1)采用顺序存储结构实现栈。

(2)采用链表结构实现栈。

2. 阿克曼函数(Ackermann?s function)定义如下:

akm(m,n)=

n+1 当 m=0 时 akm(m-1,1) 当 m>0,n=0 时 akm(m-1,akm(m,n-1)) 当 m>0,n>0 时

人们之所以研究该函数,是因为m和n值的较小增长都会引起函数值的极快增长。 (1)设计运用递归算法的源程序,上机运行。

(2)写一个非递归算法的源程序,上机运行。并进行比较。

3.二项式(a+b)n展开后,其系数构成杨辉三角形,利用队列写出打印杨辉三角形的前n行的程序。

1

1 1 1 2 1 1 3 3 1

31

实习四 串

一、实习目的

1. 熟悉串类型的实现方法,了解简单文字处理的设计方法。

2. 熟悉C语言的字符和把字符串处理的原理和方法。下面简单介绍C相关知识: (1) 字符:

char ch; ch是单个字符变量 ch=?a?; ?a? 是字符常量 (2)字符串:

Char s1[10],*s2,s3[2][10];

S1 是一维字符数组,也称它是字符串变量;

S2 是指向字符的指针变量,可以给它分配一批单元存放字符,也称为串; S2=(char )malloc(sizeof(char)*10);

S3 是2行10列的二维字符数组,一般看做含有2个字符串的数组s3[0],s3[1],每个串最多容10个字符;

下列赋值语句是错误的:

S1= “abcdefghi” ; 应该使用串拷贝函数:

strcpy(S1, “abcdefghi”); strcoy( S2, ”abcdefghi”);

strcpy(S3[0], ”123456789”); strcpy(S3[1], ”jklmnopqr”) ;

用双引号括起来的是字符串常量,在处理字符串常量时,注意总是有一个字符‘\\0’作为字符串常量的结尾 。”123456789”存入S3[0]要占用10个位置,而不是9个。S3[0][0]里是1,……,s3[0][8]里是9,s3[0][9]里是?\\0?(串尾标志)。 (3)常见的字符函数:

int strlen(streing)

string 可以是串变量或常量, 函数结果是串长度(不含‘\\0’)。

strcpy( str ,str2 );

str是串变量,str2可以是串变量或常量。函数的作用是将str2的串拷贝给串变量str。

int strcmp( str1 ,str2 );

str1,str2可以是串变量或常量,函数的作用是将两个串进行比较, 当 str1==str2,函数结果=0; 当 str1>str2, 函数结果>0; 当 str1

str1,str2可以是串变量或常量,函数的作用是将两个串进行连接,函数结果是连接后的新串。

二、实例

32

实现字符串置换操作。 #include #include /* 函数声明 */

int index(char *s, char *t,int pos); void replace(char *s,char *t,char *v); /* 主函数 */ main()

{ int k; char *s,t[]=\ s=(char *)malloc(100*sizeof(char));

printf(\ printf(\

replace(s,t,v); /* 调用串置换函数 */ printf(\} /* main */

/* 串的置换,将主串s中的t串,置换为v串 */ void replace(char *s,char *t,char *v) { int i,j,k,po,sl,tl;

sl=strlen(s); tl=strlen(t);

printf(\ po=0;

while( po< sl-tl+1)

{ k=index(s,t,po); /* 调用串匹配函数 */ printf(\ i=k-1;

for(j=0;j<=tl-1;j++) { s[i]=v[j];i++;} po=k+tl;

printf(\ }

} /* replace */ /* 串匹配函数 */

/* 从主串s的第pos个字符开始查找子串t,函数结果是子串t在主串s的pos开始之后首次出现的位置 */

int index(char *s, char *t, int pos) {int i,j,sl,tl;

i=pos; j=1; sl=strlen(s); tl=strlen(t); while(i<=sl && j<=tl)

if(s[i-1]==t[j-1]) {i++; j++; } else { i=i-j+1+1; j=1;}

33

if(j>tl) return(i-tl); else return(-1); } /* index */ 三、实习题

1. 将上述实例打入计算机,调试运行。

字符串常量的提供有多种手段。可以在定义串类型同时初始化串值: char t[]=\

还可以使用语句gets(s)进行输入;也可以用scanf(\进行输入。请你试着用不同的方法修改、调试、运行程序。

2. 设计可以在主串s中第i个位置插入一个子串t的程序。

3. 设计可以在主串s中从第i个位置开始共取m个字符,求子串的程序。

实习五 数 组

一、实习目的

熟悉稀疏矩阵的“三元组表”和“十字链表”存储结构,运用它们进行矩阵简单运算处理。 二、实例

稀疏矩阵的十字链表存储与输出。

#include #include #include typedef int Etype;

typedef struct OLnode

{int i,j; /* 行号、列号域 */ Etype e; /* 数据域 */ struct OLnode *right,*down; /* 行向的、列向的指针域 */ } OLnode; /* 数据元素结点类型 */ typedef struct { OLnode *rh[5],*ch[5]; int mu,nu,tu;

}Crosslist; /* 十字链表行、列表头 */ /* 函数声明 */

void creatMatrix(Crosslist *M); void out_M(Crosslist M); Crosslist ma; int z; /* 主函数 */ main()

34

{ creatMatrix(&ma); out_M(ma); } /* main */

/* 十字链表的输出 */ void out_M(Crosslist M)

{ int i; OLnode *p; char ch;

/* 输出矩阵的总行数、总列数、非零元素总个数 */ printf(\ for(i=1; i<=M.mu; i++)

{ p=M.rh[i]; /* 指向第i行 */ if(p){ printf(\ while(p){ printf(\ p=p->right; } }

printf(\ }

printf(“\\n 打回车键,返回。“); ch=getch(); }

void creatMatrix(Crosslist *M) { int m,n,t,row,col,i,j;

Etype va; OLnode *p,*q,*s;

/* 输入矩阵的总行数、总列数、非零元素总个数 */ printf(\ for(i=1; i<=m;i++) M->rh[i]=NULL; for(j=1; j<=n;j++) M->ch[j]=NULL;

M->mu=m; M->nu=n; M->tu=t; /* 建立成空十字链表 */ /* 以下为非零元素的逐一输入和插入 */ for(i=1;i<=M->tu;i++)

{ printf(\ p=(OLnode *)malloc(sizeof(OLnode)); p->i=row; p->j=col; p->e=va; /* 在第row行上链接 */ q=M->rh[row]; s=q;

while(q!=NULL && q->j < col){ s=q; q=q->right;} p->right=q;

if(q==M->rh[row])M->rh[row]=p; else s->right=p; /* 在第col列上链接 */

35


C语言版的数据结构(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:怎样评估自己的发展史

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: