数据结构习题讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主函数
void main() { struct student *creat(int *d,int *len); void print(struct student *head); struct student *add(struct student *m,struct student *n); struct student *sub(struct student *m,struct student *n); int compare(struct student *m,struct student *n); struct student *m,*n,*sum; int s1,s2,s3,k; char ch;
四 实验提示
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> #define LEN sizeof(struct student) struct student{ int score; struct student *next; }; int lenm,lenn,lensum;//m与n的长度
比较函数与输出函数提示
• 比较时先比较链表的长度 • 若长度相同则比较每一个结点中的数据 • 输出时先将链表中的数保存到数组中,然 后逆序输出
第2周星期五作业
• 2.14:试写一算法在带头结点的单链表结构 上实现表操作:LENGTH(L) • 设结点类型如下: typedef struct LNode { ElemType data; // 数据域 struct LNode *next; // 指针域 } LNode, *LinkList;
课堂练习
定义一个函数,函数原型为: int StoI(char snum[100],int num[25]) 函数的功能为:将snuLeabharlann Baidu中的字符型数字转换成整 型数据存放在数组num中并返回其符号。如 若snum中存放的是下面的字符串: "-123,4567,8901" 则num[0]=123,num[1]=4567,num[2]=8901,返回 - 1, 若snum中的字符串为: "123,4567,8901,1234" 则num[0]=123,num[1]=4567,num[2]=8901, num[3]=1234,返回1.
poly derivative(poly old){ poly p,q,head; p=(poly)malloc(sizeof(struct polynomail)); q=head=p; q->expn=-1;q->next=NULL;old=old->next; while(old) {p=(poly)malloc(sizeof(struct polynomail)); p->coef=old->coef*old->expn; p->expn=old->expn-1; p->next=NULL; q->next=p; old=old->next; q=p; } return head;}
else {p2=(poly)malloc(sizeof(struct polynomail)); p2->coef=old->coef; p2->expn=old->expn; p2->next=NULL; q2->next=p; old=old->next; q2=p; } }}
第3周星期五作业
struct student *creat(int *sign,int *n)
{
void print(struct student *head);struct student *p1,*p2; int i=0,j,k=0,len; char s[5],c[130]; *sign=1; gets(c); if(c[0]=='-'){i=1;*sign=-1;} p1=p2=(struct student *)malloc(LEN);//建立尾结点 p1->score=0; p1->next=NULL;
主函数中的算法
1,选择运算:+或- 2,调用函数create输入第1个数并放在链表m中,s1 为其符号 3,调用函数create输入第,2个数并放在链表n中,s2 为其符号 4,调用compare函数比较m,n的大小 5,处理加法运算 5.1 若m,n同号,则调用add函数相加 5.2 若m,n不同号,则调用sub函数相减(大-小) 6,处理减法运算 7,输出(先输出符号,然后调用print函数输出)
第4周星期二作业
• 写出P55中的Ackerman函数的递归算法和 Fibonacci数列的非递归算法 double Ack(double m,double n){ if(m==0) return n+1; if(n==0) return Ack(m-1,1); return Ack(m-1,Ack(m,n-1)); } Fibonacci数列的非递归算法见《C程序设计》 P133
• 试编写算法,计算i!*2i(i=0,1,2,...,n-1)的值 并分别存入数组a[arrsize]的各个分量中。 假设计算机中允许的整数最大值为MAXINT, 则当 • n>arrsize, • 或对某个k(0<k<=n-1)使k!*2k>MAXINT时 应按出错处理
int f(int a[ ],int n) { a[0]=1 for(i=1;i<=n;i++) {a[i]=a[i-1]*i*2 if(a[i]>MAXINT) return ERROR }
加减法运算函数提示
• 链表是按表头数据为长整数的低位,表尾 为高位存放 • 运算时要考虑进位和借位 • 运算结果参考creat函数存放到链表中(每 得出一个结果均插入到链表表头
加减法运算函数算法
1,生成首结点,将其地址保存到head,p1,p2中,其中 p1指向新结点,p2指向链表的最后一个结点,head为链 表的头指针 2,给首结点赋值(其值为m,n中第1个结点的和的万位以 下的数,保存进位 3,m,n指向下一结点 4,While(m&&n) {生成新结点,其值为m,n与进位之和, 保存进位 将新结点链接到链表的表尾 m,n指向下一结点} 5,处理m中余下的结点 6,处理n中余下的结点 7,返回head
len=strlen(c); for(;i<len;i++) { j=0; while(c[i]>='0'&&c[i]<='9')//取出逗号之间的每一组数 存放到字符数组s中 { s[j++]=c[i++]; k++;} s[j]='\0'; p1=(struct student *)malloc(LEN); p1->score=atoi(s);//将s转换成整数 p1->next=p2;//插入到链表头 p2=p1; } *n=k; return(p1); }
while(old) {if(old->expn%2) {p1=(poly)malloc(sizeof(struct polynomail)); p1->coef=old->coef; p1->expn=old->expn; p1->next=NULL; q1->next=p; old=old->next; q1=p; }
课堂练习答案
int StoI(char snum[100],int num[25]) //函数的功能为:将snum中的字符型数字转换成整型数//据存放 在数组num中并返回其符号 {int i,j,k,sign; i=0;j=0; char s[10]; if(snum=='-'){sign=-1;i++;}//若第1个符号为负则该数为负数 else sign=1; while(snum!='\0') {k=0; while(snum[i]>='0'&&snum[i]<='9') s[k++]=snum[i++]; if(k)num[j++]=atoi(s); } return sign;}
• 2.42 试编写算法,将一个用循环链表表 示的稀疏多项式分解成两个多项式,使这 两个多项式各自仅含奇次项和遇次项 • 多项式类型定义与2..41同
void oddeven(poly old,poly &odd,poly &even){
ploy p1,p2,q1,q2; p1=(poly)malloc(sizeof(struct polynomail)); q1=odd=p1; q1->expn=-1;q1->next=NULL; p2=(poly)malloc(sizeof(struct polynomail)); q2=even=p1; q2->expn=-1;q2->next=NULL; old=old->next;
数据结构习题讲解
第1周 作业
试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有 理数的定义。 ADT ComplexNum{ 数据对象:D={a,b|a,b∈R} 数据关系:R1={<a,b>| a,b∈R} 基本操作: InitComplexNum(&C,a,b) 操作结果:构造一个复数C,元素a,b分别作为复数的实部和虚部 real(C,&r)
int LENGTH(LinkList L) {int i=0; while(L) {L=L->next;i++;} return i; }
第3周星期二
• 2.41 试以循环链表作稀疏多项式的存储结构,编写算法 求其导函数的算法
typedef struct polynomail{ float coef; // 系数 int expn; // 指数 struct polynomail *next; } *poly;
实验二
线性表的应用(4学时)
一、实验目的:掌握线性表的基本结构和操作方法, 培养学生灵活使用结构解决实际问题的能力。 二、实验内容: 设计一个100位以内的长整数加减运算的程序。 三、实验要求: 1,输入输出要求:每四位一组,组间用逗号分隔; 2,加和减分别用不同的程序实现 3,程序应考虑输入数据的符号
•1,简述栈与线性表的区别 栈是一种特殊的线性表,是只能在一端 进行插入与删除的线性表。而一般的线性表 则可在其他位置插入与删除
•2,试写一个判别表达式中中括号是否配对 出现的算法
中括号匹配算法
Status matching(char a[ ]){ InitStack(S); i=0; while(a[i]!='\0') {if(a[i]=='[') push(S,a[i]); if(a[i]==']') if(Pop(S,e)) return ERROR; i++;} if(!StackEmpty(S)) return ERROR; return OK; }
操作结果:返回复数的实部 imaginary (C,&i) 操作结果:返回复数的虚部 ... }ADT ComplexNum
抽象数据类型有理数的定义
ADT RationalNumber { 数据对象:D={a,b|a,b∈Z,b≠0} 数据关系:R1={<a,b>| a,b∈Z,b≠0} 基本操作: InitRationalNumber(&C,a,b) 操作结果:构造一个有理数C,a,b分别作为有理数的分子和 分母 molecule(C,&r) 操作结果:返回有理数的分子 denominator (C,&i) 操作结果:返回有理数的分母 ... }ADT RationalNumber