收藏 分享(赏)

c语言第一章.ppt

上传人:ysd1539 文档编号:8147710 上传时间:2019-06-11 格式:PPT 页数:105 大小:382.50KB
下载 相关 举报
c语言第一章.ppt_第1页
第1页 / 共105页
c语言第一章.ppt_第2页
第2页 / 共105页
c语言第一章.ppt_第3页
第3页 / 共105页
c语言第一章.ppt_第4页
第4页 / 共105页
c语言第一章.ppt_第5页
第5页 / 共105页
点击查看更多>>
资源描述

1、数据结构算法Visual C+ 6.0程序集侯 识 忠 等编著 中国水利水电出版社,第一章 顺序存储结构的表、堆栈和队列,1、0 线性表的数组表示和实现 /线性表的类定义linelist1.h #define MaxListSize 20 #define EQUAL 1 typedef struct STUchar name10;char stuno10;int age;int score; ElemType;,class List private:/线性表的数组表示ElemType elemMaxListSize;int length;int MaxSize;public:/初始化顺序表vo

2、id init(List *L,int ms);/删除顺序表void DestroyList(List ,/遍历顺序表void ListTraverse();/返回顺序表的长度int ListLength();/ 获取顺序表中第i 个元素void GetElem(int,ElemType *);/ 判断顺序表两元素是否相等bool EqualList(ElemType *,ElemType *);/ 判断顺序表两元素是否不等bool Less_EqualList(ElemType *,ElemType *);/顺序表的查找算法bool LocateElem(ElemType,int);/更新线

3、性表中的给定元素bool UpdateList(ElemType,/线性表的实现linelist1.cpp,#include “linelist1.h“ void List:init(List *L,int ms) *L=(List *)malloc(sizeof(List);(*L)-length=0;(*L)-MaxSize=ms; int List:ListLength() return length; ElemType List:PriorElem(ElemType cur_e,ElemType ,ElemType List:NextElem(ElemType cur_e,ElemTy

4、pe i+),elemi-1=elemi;else /删除表尾元素if(mark=length) return false;else e=elemi;for(j=i+1;jlength;j+)elemj-1=elemj;length-;return true; ,void List:ListTraverse() for(int i=0;ilength;i+)coutsetw(8)elemi.name;coutsetw(10)elemi.stuno;coutsetw(9)elemi.age;coutsetw(8)elemi.scoreendl; void List:GetElem(int i,E

5、lemType *e) *e=elemi;,bool List:EqualList(ElemType *e1,ElemType *e2) if (strcmp(e1-name,e2-name)return false;if (strcmp(e1-stuno,e2-stuno)return false;if (e1-age!=e2-age)return false;if (e1-score!=e2-score)return false;return true; ,bool List:Less_EqualList(ElemType *e1,ElemType *e2) if(strcmp(e1-na

6、me,e2-name)=0) return true;else return false; bool List:LocateElem(ElemType e,int type) int i;switch (type) case EQUAL:for(i=0;ilength;i+)if(EqualList( ,/更新线性表中的给定元素 bool List:UpdateList(ElemType,void List:MergeList(List *La,List *Lb) int i,j,La_len,Lb_len;La_len=La-ListLength();Lb_len=Lb-ListLength

7、();for(i=0;ielemi;for(j=0;jelemj;length=La_len+Lb_len; void List:UnionList(List *La, List *Lb) int i,La_len,Lb_len;ElemType e;La_len=La-ListLength();Lb_len=Lb-ListLength();for(i=0;iGetElem(i,/对线性表按升序或降序输出 void List:printlist(int mark) int* b=new intlength;int i,k;cout“ 姓名 学号 年龄 成绩n“;if(mark!=0)for(i

8、=0; ilength;i+) bi=i;for(i=0; ilength;i+) k=i;for(int j=i+1;jlength;j+) if(mark=1i+),coutsetw(8)elembi.name;coutsetw(10)elembi.stuno;coutsetw(9)elembi.age;coutsetw(8)elembi.scoreendl;else for(i=0;ilength;i+)coutsetw(8)elemi.name;coutsetw(10)elemi.stuno;coutsetw(9)elemi.age;coutsetw(8)elemi.scoreendl

9、; ,/线性表的应用linelist1m.cpp #include #include #include #include #include “linelist1.cpp“ void main() cout“linelist1m.cpp运行结果:n“;ElemType e,e1,e2,e3,e4,e5,e6;List *La,*Lb,*Lc;int k;cout“首先调用插入函数.n“;,La-init(,strcpy(e3.stuno,“100003“);e3.age=19;e3.score=87;La-ListInsert(3,e3);La-printlist(0);coutListLeng

10、th()init(,strcpy(e5.name,“bobjin“);strcpy(e5.stuno,“100002“);e5.age=23;e5.score=69;Lb-ListInsert(2,e5);strcpy(e6.name,“stu1“);strcpy(e6.stuno,“100001“);e6.age=22;e6.score=88;Lb-ListInsert(3,e6);Lb-printlist(0);coutListLength()endl;cin.get();,coutinit(,coutprintlist(0);cin.get();strcpy(e.name,“NoName

11、“);La-PriorElem(e2,e);if(strcmp(e.name,“NoName“)=0) coutNextElem(e3,e);if(strcmp(e.name,“NoName“)=0) cout“e3无后继!n“;else cout“e3的后继e.name=“e.nameendl;cin.get();,单击此处运行程序,coutprintlist(1);cin.get();coutprintlist(-1);cin.get(); ,1、1 线性表的动态分配顺序表示和实现,/线性表的类定义linelist2.h #define EQUAL 1 #define OVERFLOW -

12、1 #define LIST_INIT_SIZE 30 #define LISTINCREMENT 10 typedef struct STUchar name10;char stuno8;int age;int score; ElemType;,/线性表的动态分配顺序存储结构 class Listprivate:ElemType *elem;/存储空间基址int length; /当前长度int listsize; /当前分配的存储容量以一数据元素存储长度为单位public:/初始化顺序表void init(List *);/删除顺序表void DestroyList(List ,/判断顺序

13、表是否为空表bool ListEmpty()if(length=0) return true;else return false;/判断顺序表是否为满bool ListFull()return length=listsize;/决定返回表中元素pre_e的前驱ElemType PriorElem(ElemType cur_e,ElemType ,/遍历顺序表void ListTraverse();/返回顺序表的长度int ListLength();/ 获取顺序表中第i 个元素void GetElem(int,ElemType *);/ 判断顺序表两元素是否相等bool EqualList(El

14、emType *,ElemType *);/ 判断顺序表两元素是否不等bool Less_EqualList(ElemType *,ElemType *);/顺序表的查找算法bool LocateElem(ElemType,int);/更新线性表中的给定元素bool UpdateList(ElemType,/顺序表的合并算法void MergeList(List *,List *);/顺序表的插入算法bool ListInsert(int,ElemType);/顺序表的联合算法void UnionList(List *,List *);/对线性表按升序或降序输出void printlist(i

15、nt); ; /线性表的操作linelist2.cpp void List:init(List *L) L-elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType);if(!L-elem) exit(OVERFLOW);L-length=0;L-listsize=LIST_INIT_SIZE;,int List:ListLength() return length; ElemType List:PriorElem(ElemType cur_e,ElemType ,ElemType List:NextElem(ElemType cur_e,E

16、lemType ,length-;return true; void List:ListTraverse() for(int i=0;iname,e2-name)=0) return true;else return false; bool List:Less_EqualList(ElemType *e1,ElemType *e2) if(strcmp(e1-name,e2-name)=0) return true;else return false; ,bool List:LocateElem(ElemType e,int type) int i;switch (type) case EQU

17、AL:for(i=0;ilength;i+)if(EqualList( ,void List:MergeList(List *La,List *Lb) ElemType *pa,*pb,*pc,*pa_last,*pb_last;pa=La-elem;pb=Lb-elem;listsize=length=La-length + Lb-length;pc=elem=(ElemType *)malloc(listsize*sizeof(ElemType);if(!elem) exit(OVERFLOW);pa_last = La-elem + La-length - 1;pb_last = Lb-

18、elem + Lb-length - 1;while(pa=pa_last ,bool List:ListInsert(int i,struct STU e) struct STU *p,*q;if (ilength+1) return false;q= ,void List:printlist(int mark) int* b=new intlength;int i,k;cout“ 姓名 学号 年龄 成绩n“;if(mark!=0) for(i=0; ilength;i+) bi=i;for(i=0; ilength;i+) k=i;for(int j=i+1;jlength;j+) if(

19、mark=1 ,/linelist2m.cpp #include #include #include #include #include #include “linelist2.h“ #include “linelist2.cpp“ void main() cout“linelist2m.cpp运行结果:n“;ElemType e,e1,e2,e3,e4,e5,e6;List La,Lb,Lc;int k;cout“首先调用插入函数.n“;,La.init(,cout“表La长:“La.ListLength()endl;cin.get();Lb.init(,e6.age=22;e6.score

20、=88;Lb.ListInsert(3,e6);Lb.printlist(0);cout“表Lb长:“Lb.ListLength()endl;cin.get();cout“表La与Lb合并为表Lc:n“;Lc.init(,单击此处运行程序,cout“表La长:“La.ListLength()endl;cin.get();k=Lc.ListDelete(-1,e);if(k=0) cout“删除失败!n“;else cout“删除成功!n“;cout“输出表Lc:n“;Lc.printlist(0);cin.get();strcpy(e.name,“NoName“);La.PriorElem(e

21、2,e);if(strcmp(e.name,“NoName“)=0) cout“e2无前驱!n“;else cout“e2的前驱e.name=“e.nameendl;strcpy(e.name,“NoName“);La.NextElem(e3,e);if(strcmp(e.name,“NoName“)=0) cout“e3无后继!n“;else cout“e3的后继e.name=“e.nameendl;cin.get();cout“按成绩升序输出表Lcn“;Lc.printlist(1);cin.get();cout“按成绩降序输出表Lcn“;Lc.printlist(-1);cin.get(

22、);,1、2 顺序堆栈的类定义(动态分配)和实现 /顺序栈的类定义stack1.h class Stack private:DataType *data;int maxSize;int top;public: /创建空栈void SetStack(int n); /栈存在则栈被销毁void FreeStack(); /栈存在则返回栈的元素个数,即栈的长度int StackSize(); /判断栈是否为空bool StackEmpty(); /判断栈是否为满bool StackFull(); /栈存在且非空则返回栈的栈顶元素DataType Peek();,/栈存在则插入元素item为新的栈顶元

23、素void Push(DataType item); /栈存在且非空则删除栈的栈顶元素并用e返回其值DataType Pop(DataType e); /栈存在则清为空栈void ClearStack(); / 栈的遍历void StackTraverse(void (*visit)(DataType *); ; /顺序栈的实现stack1.cpp /#include “stack1.h“ void Stack:SetStack(int n) data=new DataTypen;if(data=NULL)cout“overflow!n“;exit(1);maxSize=n;top=-1; ,

24、void Stack:FreeStack() free(data); int Stack:StackSize() return(top+1); bool Stack:StackEmpty() if(top=-1) return true;return false; bool Stack:StackFull() if(top=maxSize-1) return true;return false; DataType Stack:Peek() if(top=-1)cerr“栈已空!n“;exit(1);exit(1);return(datatop); ,void Stack:Push(DataTy

25、pe item) if(top=maxSize-1)cerr“栈已满!n“;exit(1);top+;datatop=item; DataType Stack:Pop(DataType e) if(top=-1)cerr“栈已空!n“;exit(1);top-;return datatop+1; void Stack:ClearStack() top=-1; void Stack:StackTraverse(void (*visit)(DataType *) while(top!=-1)visit(data);top-; ,/顺序栈的测试stack1M.cpp #include #includ

26、e #include #include typedef struct STUchar name10;char stuno10;int age;int score; DataType; #include “stack1.h“ #include“stack1.cpp“ void StackPrintElem(DataType *e) coutnamestuno;coutage;coutscoreendl; ,void main() DataType e;Stack Sa;/clrscr();int N=8;cout“stack1M.cpp运行结果:n“;cout“首先调用创建空栈函数!n“;Sa.

27、SetStack(N);strcpy(e.name,“stu1“);strcpy(e.stuno,“100001“);e.age=20;e.score=87;Sa.Push(e);cout“压栈后现在栈中有一个元素!n“;StackPrintElem(,单击此处运行程序,cout“现在栈中有二个元素!n“;StackPrintElem(,1、3 顺序堆栈的类定义(动态分配)和实现 /顺序栈的类定义stack.h #define ERROR 0 #define EQUAL 1 #define OVERFLOW -1 #define STACKSIZE 100 #define STACKINCRE

28、MENT 10 class SqStack private:SElemType *base;SElemType *top;int stacksize;public: /构造一个空栈SStatus InitStack(SqStack *S); /栈存在则栈被销毁Status DestroyStack(); /栈存在则清为空栈Status ClearStack(); /栈存在则返回true,否则falsebool StackEmpty();,/ 栈存在则返回栈的元素个数,即栈的长度int StackLength(); /栈存在且非空则返回栈的栈顶元素SElemType GetTop(); / 栈存

29、在则插入元素e为新的栈顶元素Status Push(SElemType e); / 栈存在且非空则删除栈的栈顶元素并用e返回其值SElemType Pop(SElemType *e); / 栈的遍历void StackTraverse(void (*visit)(SElemType *); ; /顺序栈的实现stack.cpp #include “stack.h“ Status SqStack:InitStack(SqStack *S) (*S)=(SqStack *) malloc(sizeof(SqStack);(*S)-base=(SElemType *)malloc(STACKSIZE

30、 *sizeof(SElemType);if(!(*S)-base) exit(OVERFLOW);(*S)-top=(*S)-base;(*S)-stacksize=0;return 1;,Status SqStack:DestroyStack() free(base);return 1; Status SqStack:ClearStack() stacksize=0;return 1; bool SqStack:StackEmpty() if(stacksize=0) return true;else return false; int SqStack:StackLength() retu

31、rn stacksize; SElemType SqStack:GetTop() if(top=base)cerr“空栈!n“;exit(1);return *(top-1); Status SqStack:Push(SElemType e) *(top+)=e;stacksize+;return 1; ,SElemType SqStack:Pop(SElemType *e) if(top=base)cerr #include #include #include #include typedef int Status ; typedef struct STUchar name10;char s

32、tuno10;int age;int score; SElemType;,void StackPrintElem(SElemType *e) coutnamestuno;coutage;coutscoreInitStack(,单击此处运行程序,coutGetTop();if(Sa-StackEmpty() coutPush(e);coutStackLength()Pop( ,1、4 顺序堆栈的类定义(数组表示)和实现 /顺序堆栈的类定义linearStack1.h const int LEN=40; class Stack private:ElemType stackLEN;int top;p

33、ublic:Stack()top=0; /构造函数 Stack() /析构函数 /创建有序或无序栈void CreateStack(int,int m=LEN,int mark=0); void ClearStack(); /清空栈bool StackEmpty(); /检查栈是否为空 ElemType Peek(); /读取栈顶元素 /向栈中插入元素void Push(const ElemType,/顺序堆栈的实现linearStack1.cpp #include #include “linearStack1.h“ /创建有序或无序栈void Stack:CreateStack(int n,

34、int m,int mark)ElemType x,aLEN/2;int i,j;for(i=0;iaj) k=j;if(k!=i)x=ak;ak=ai;ai=x;for(i=0;im;i+)if(mark=1) Push(am-1-i);/升序elseif(mark=-1) Push(ai);/降序else Push(rand()%100);/无序,/清空栈void Stack:ClearStack() top=0; /检查栈是否为空bool Stack:StackEmpty() return top=0; /读取栈顶元素ElemType Stack:Peek()if(top=0) cerr

35、“栈为空!“endl;exit(1);return stacktop; /向栈中插入元素void Stack:Push(const ElemType,/从栈中删除元素ElemType Stack:Pop()if(top=0) cerr“栈为空!“endl;exit(1);top-;return stacktop+1; /检查栈是否已满bool Stack:StackFull(int m)return top=m; /栈的输出void Stack:StackPrint(int m)for(int i=0;im;i+)coutsetw(3)Pop();,/顺序堆栈的测试linearStack1m.

36、cpp #include #include typedef int ElemType; #include “linearStack1.cpp“ void main() cout“linearStack1m.cpp运行结果:n“;int m=10,n=120;Stack q,p,w;q.CreateStack(n,m,1);cout“n输出q栈元素(升序):n“;q.StackPrint(m);coutendl;cout“q栈:“;if(q.StackFull(m)=1)cout“已满!n“;else cout“未满!n“;cout“创建栈p(降序):n“;p.CreateStack(n+10,

37、m,-1);cout“p栈:“;,单击此处运行程序,if(p.StackFull(m)=1)cout“已满!n“;else cout“未满!n“;cout“删除元素为:“p.Pop()endl;cout“p栈:“;if(p.StackEmpty()=1)cout“为空!n“;else cout“为非空!n“;cout“输出p栈元素:n“;p.StackPrint(m-1);coutendl;cout“创建栈w(无序):n“;w.CreateStack(2*n,m);cout“输出w栈元素:n“;w.StackPrint(m);coutendl;p.ClearStack();cin.get();

38、cin.get();,1、5 将中缀表达式转换为后缀表达式 /将中缀表达式转换为后缀表达式的文件zhuanhuan.cpp const int SM=40; #include“linearStack1.cpp“ int Precedence(char op); void zhuanhuan(char s1SM,char s2SM) /将字符串s1中的中缀表达式转换为存于字符串s2中的后缀表达式 Stack R; /定义用于暂存运算符的栈R.Push(); /给栈底放入字符,它具有最低优先级0int i,j;i=0; /用于指示扫描s1串中字符的位置,初值为0j=0; /用于指示s2串中待存字符

39、的位置,初值为0char ch=s1i;/ch保存s1串中扫描到的字符,初值为第一个字符while(ch!=)/顺序处理中缀表达式中的每个字符if(ch= )/对于空格字符不做任何处理,顺序读取下一个字符ch=s1+i;else if(ch=()R.Push(ch);/对于左括号,直接进栈ch=s1+i;,else if(ch=)/对于右括号,使括号内的仍停留在栈中的运算符依次/出栈并写入到s2中while(R.Peek()!=()s2j+=R.Pop();R.Pop(); /删除栈顶的左括号ch=s1+i;else if(ch=+|ch=-|ch=*|ch=/)/对于四则运算符,使暂存在栈中

40、的不低于ch优先级/的运算符依次出栈并写入到s2中char w=R.Peek();while(Precedence(w)=Precedence(ch)/Precedence(w)函数返回运算符形参的优先级s2j+=w;R.Pop();w=R.Peek();R.Push(ch); /把ch运算符写入栈中ch=s1+i;else/此处必然为数字或小数点字符while(isdigit(ch)|ch=.)/把一个数值中的每一位依次写入到s2串中s2j+=ch;ch=s1+i; /被转换后的每个数值后放入一个空格s2j+= ; ,/把暂存在栈中的运算符依次出栈并写入到s2串中ch=R.Pop();whi

41、le(ch!=) if(ch=() cerr“expression error!“endl;exit(1);else s2j+=ch;ch=R.Pop(); /在后缀表达式的末尾放入表达式结束符和字符串结束符s2j+=;s2j+=0; /求运算符优先级的Precedence函数为:int Precedence(char op) /返回运算符op所对应的优先级数值switch(op)case +:case -:return 1;/定义加减运算的优先级为1case *:case /:return 2;/定义乘除运算的优先级为2,单击此处运行程序,case (:case : /定义在栈中的左括号和栈

42、底字符的优先级为0default:return 0; /zhuanhuanm.cpp #include #include #include #include /含有int isdigit(int c)函数的原型 #include typedef char ElemType; #include “zhuanhuan.cpp“ void main() printf(“nzhuanhuanm.cpp运行结果:n“);printf(“输入中缀表达式:“);char p140,p240;gets(p1);zhuanhuan(p1,p2);printf(“n输出后缀表达式:“);printf(“%s“,p

43、2);cin.get(); ,1、6 十进制数转换成八进制数 /十进制数转换成八进制数convert.cpp #include #include #include #include #include #include typedef int Status; typedef int SElemType; #include “stack.cpp“ void conversion() SqStack *S;SElemType e;int n;S-InitStack(,单击此处运行程序,while(n)S-Push(n%8);n=n/8;printf(“结果是:“);while(!S-StackEmp

44、ty()S-Pop(,1、7 括号匹配的检验 /刮号匹配的检验kuohaopipei.cpp #include #include #include #include typedef char Status; typedef char SElemType; #include “stack.cpp“ void main() SqStack *p;int n,m=32,q=0;char ch,ca,cd;coutInitStack(n+),cinch;if(ch=) p-Push(ch);if(ch=() p-Push(ch);if(ch=) p-Push(ch);if(ch=)ca=p-Pop(,

45、单击此处运行程序,if(p-StackEmpty() break;if(q=1) cout“刮号序列不匹配!n“;else cout“刮号序列匹配!n“;cin.get();cin.get();,1、8 行编辑程序 /单行编辑LINEEDIT.CPP #include #include #include #include #include #define EOFILE typedef char Status; typedef char SElemType; #include “stack.cpp“ void LineEdit() SqStack *S,*T;char str100;int st

46、rlen=0;char e;char ch;S-InitStack(,while(ch!=EOFILE)while(ch!=EOFILE,单击此处运行程序,while(!T-StackEmpty() T-Pop(,1、9 行编辑程序 /顺序栈的类定义stack2.h #define ERROR 0 #define EQUAL 1 #define OVERFLOW -1 #define STACKSIZE 100 #define STACKINCREMENT 10 class SqStack private:SElemType *base;SElemType *top;int stacksize

47、;public: /构造函数SqStack(); /栈存在则栈被销毁Status DestroyStack(); /栈存在则清为空栈Status ClearStack();,/栈存在则返回true,否则falsebool StackEmpty(); / 栈存在则返回栈的元素个数,即栈的长度int StackLength(); /栈存在且非空则返回栈的栈顶元素SElemType GetTop(); / 栈存在则插入元素e为新的栈顶元素Status Push(SElemType e); / 栈存在且非空则删除栈的栈顶元素并用e返回其值SElemType Pop(SElemType *e); / 栈的遍历void StackTraverse(void (*visit)(SElemType *); ; /顺序栈的实现stack2.cpp #include “stack2.h“ SqStack:SqStack() base=(SElemType *)malloc(STACKSIZE *sizeof(SElemType);if(!base) exit(OVERFLOW);top=base;stacksize=0; ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报