数据结构与算法-编写实例
这篇算是学习过程中的备忘录,之前没有好好敲过这门课的代码,现在开始把每节课敲的代码记录下来,方便期末复习和以后使用。
第一节课:线性表的基本操作
#include <cstdio>//C++的编译 #include <cstdlib> #include <iostream>//c++输入输出 using namespace std;//命名空间 #define MAXSIZE 100 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status;// 状态 是个整型 typedef int ElemType; typedef struct{ ElemType *elem;//数据的基地址 int length;//实际长度 }SqList; //1.初始化操作 Status InitList(SqList &L){ //不引用的话,创建可以成功, 但是申请空间给了形参。对参数的值有改变则需要引用,否则都行。 L.elem = new int[MAXSIZE];//MAXSIZE个整形空间 if(L.elem==NULL)//没有申请空间成功,失败 { // printf("fail!"); return ERROR;//exit(OVERFLOW); } L.length=0; return OK; } //2.销毁线性表 void DestroyList(SqList &L) { if(L.elem) delete []L.elem;//不需要写free了 } //3.清空 void ClearList(SqList &L) { L.length=0;//长度置为0 } //4.显示线性表 void DispList(SqList &L)//参数引用不引用都可以 { int i; for(i=0;i<L.length;i++) printf("[%d]",L.elem[i]); printf("\n"); } //5.求长度 int LengthList(SqList &L) { return L.length; } //6.判断是空 7.是满(return (L.length==MAXSIZE);) bool isEmptyList(SqList &L) { // return L.length==0?1:0; return (L.length==0); // if(L.length ==0) // return 1; // else // return 0; } //8.查: 按位置 按值 Status GetItem(SqList &L,int i,ElemType &e)//在L中找第i个元素 { if(i<1 || i>L.length) return ERROR; e=L.elem[i-1]; return OK; } int LocateItem(SqList &L,ElemType e)//在L中找到e值,并返回位置 { // int i; // for(i=0;i<L.length ;i++) // if(L.elem[i]==e) // return i+1; // return 0; int i=0; while(i<L.length && L.elem[i]!=e) i++; if(i==L.length) return 0;//找完了没找到 else return i+1; } //9.在第i个元素前插入 e Status InsertList(SqList &L,int i,ElemType e) { int j; if(i<1||i>L.length+1)//判断位置是否合法 return ERROR; if(L.length==MAXSIZE) return ERROR;//if(isFullList(L)) for(j=L.length-1;j>i-1;j--) L.elem[j+1]=L.elem[j]; L.elem[i-1]=e; L.length++; return OK; } //10.在L中删除第i个元素,把要删除的数据放到e中 Status DeleteList(SqList &L,int i,ElemType &e) { int j; if(i<1 || i>L.length) return ERROR; e=L.elem[i-1];//在被删掉之前保存在e中 for(j=i;j<L.length;j++) L.elem[j-1]=L.elem[j];//相当于把下标为i-1,即第i个元素被后边给覆盖了 // for(j=i-1;j<L.length-1;j++) // L.elem[j]=L.elem[j+1]//被后边元素覆盖 L.length--; return OK; } int main(){ SqList L; int i; if(InitList(L)==1) { printf("success! lentgh=%d\n",L.length); } for(i=0;i<5;i++) L.elem[i]=i;//添加一些元素测试 L.length=5; DispList(L); return 0; }
日后更。2020-02-29 12:34:21
第二节课:单链表基本操作
实现单链表常用的操作:初始化、判空、清空、计数(长度)、按位置查找、按值查找、插入、删除、创建(前插法)、创建(尾插法)、逆置、显示等。
#include <cstdio> #include <cstdlib> #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct Node{ int data; struct Node *next; }LNode,*LinkList; //初始化 Status InitList(LinkList &L){ L=new Node; if(!L) return 0; L->next=NULL; return 1; } //前插法 .数都是倒着的 void CreateList(LinkList &L,int n){ LNode *p; L=new LNode; L->next=NULL; int i; p=L->next; printf("请输入元素:\n"); for(i=n;i>0;--i) { p=new LNode; // printf("请输入元素:\n"); scanf("%2d",&p->data); p->next=L->next; L->next=p; } } //后插法,顺序正着来啦. void CreateList_L(LinkList &L,int n){ int i; L=new LNode; L->next=NULL; LNode *r,*p; r=L;//刚开始指向头结点 printf("请输入元素:\n"); for(i=0;i<n;++i){ p=new LNode; scanf("%2d",&p->data); p->next=NULL; r->next=p;//插入到表尾 r=p;//r指向新的尾节点 } } //遍历 void DispList(LinkList L){//不改动数值可以不引用& LNode *p; p=L->next;//指向第一个节点 printf("->"); while(p)//p!=NULL { printf("%d->",p->data); p=p->next; } } //求表长 int LengthList(LinkList L){ LNode *p; int i=0; p=L->next; while(p){ i++; p=p->next; } return i; } //判断是否为空 bool isEmptyList(LinkList L){ return L->next==NULL; } //按位置查找元素 LNode *GetItem(LinkList L,int i){ LNode *p=L->next; int j=1; while(p!=NULL && j<i){ j++; p=p->next; } // if(p){ // printf("第%d个位置的元素是:%d\n",i,p); // }else // printf("没找到该位置!\n"); return p; } //插入到指定位置前 Status InsertList(LinkList &L,int i,ElemType e){ LNode *p; if(i<1) return 0; if(i>1) p=GetItem(L,i-1); else p=L; if(p==NULL) return 0; LinkList s; s=new LNode; s->data=e; s->next=p->next; p->next=s; return 0; } //删除操作 Status DeleteList(LinkList &L,int i) { LNode *p=L; //找第i-1个结点, 并判断 p 后面有没有结点 p=L; int j=0; while(p->next && j<i-1)// { j++; p=p->next; } if(p->next==NULL||j>i-1) return ERROR; LNode *s; s=p->next; // e=s->data; p->next=s->next;//p->next=p->next->next delete s; return OK; if(p==NULL || j>i-1) return ERROR; } //销毁表 Status DestroyList(LinkList &L){ LinkList p; while(L){ p=L; L=L->next; delete p; } return OK; } //按值查找 int LocateItem(LinkList L,ElemType e) { int i=1; LNode *p = L->next; while(p&&p->data!=e) { p=p->next; i++; } return i; } //清空表 Status ClearList(LinkList &L){ LinkList p,q; p=L->next; while(p){ q=p->next; delete p; p=q; } L->next=NULL; return OK; } //逆置 void reverse(LinkList &H) { LNode *p,*q; p=H->next; H->next=NULL; while(p!=NULL){ q=p; p=p->next; q->next=H->next; H->next=q; } } void tool(){ printf("------------------------------>\n"); printf("_____功能菜单______\n"); printf("1.初始化\n 2.创建(前插法)\n 3.创建(后插法)\n 4.插入\n 5.显示\n 6.删除\n 7.逆置\n 8.判空\n 9.表长\n 10.清空\n 11.销毁\n 12.按位置查找\n 13.按值查找\n"); printf("按其他键退出!\n"); printf("------------------------------>\n"); } void menu(LinkList &L){ int i,n; ElemType e; tool(); while(true){ printf("按0可查看菜单\n"); printf("请选择:\n"); scanf("%d",&i); switch(i){ case 1: printf("初始化成功!\n"); InitList(L); break; case 2: printf("前插法:请输入插入数量\n"); scanf("%d",&n); CreateList(L,n); break; case 3: printf("尾插法:请输入插入数量\n"); scanf("%d",&n); CreateList_L(L,n); break; case 4: printf("请输入插入位置和插入数值\n"); scanf("%d%d",&n,&e); InsertList(L,n,e); break; case 5: DispList(L); break; case 6: printf("请输入删除位置:\n"); scanf("%d",&n); DeleteList(L,n); break; case 7: //逆置 reverse(L); break; case 8: if(isEmptyList(L)) printf("空的!\n"); else printf("不是空的!\n"); break; case 9: printf("表长为:%d\n",LengthList(L)); break; case 10: ClearList(L); printf("清空成功!\n"); break; case 11: DestroyList(L); printf("销毁成功!\n"); break; case 12: printf("请输入查找的位置:\n"); scanf("%d",&n); if(GetItem(L,n)) printf("查找的值是:%d\n",GetItem(L,n)->data); else printf("没找着!\n"); break; case 13: printf("请输入要查找的值\n"); scanf("%d",&e); if(LocateItem(L,e)) printf("要查找的元素在第%d位\n",LocateItem(L,e)); else printf("没找着!\n"); break; case 0: tool(); break; default: printf("再见!\n"); exit(0); } } } int main(){ LinkList L; menu(L); }
实现在有序的单链表插入元素,仍保持其有序性
#include <cstdio> #include <cstdlib> #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct Node{ int data; struct Node *next; }LNode,*LinkList; //初始化 Status InitList(LinkList &L){ L=new Node; if(!L) return 0; L->next=NULL; return 1; } void CreateList_L(LinkList &L,int n){ int i; L=new LNode; L->next=NULL; LNode *r,*p; r=L;//刚开始指向头结点 for(i=0;i<n;++i){ p=new LNode; printf("请输入元素:\n"); scanf("%d",&p->data); p->next=NULL; r->next=p;//插入到表尾 r=p;//r指向新的尾节点 } } //遍历 void DispList(LinkList L){//不改动数值可以不引用& LNode *p; p=L->next;//指向第一个节点 printf("->"); while(p)//p!=NULL { printf("%d->",p->data); p=p->next; } } LNode* InsertList(LinkList &L,ElemType e){ LNode *p; LinkList s; p=L->next; while(p->next!=NULL){ if(e<p->next->data) { s=new LNode; s->data=e; s->next=p->next; p->next=s; break; } // printf("->\n"); p=p->next; } // DispList(p); return 0; } int main(){ LinkList L; int i; ElemType e; InitList(L); printf("请输入五个元素\n"); CreateList_L(L,5); printf("请输入要插入的数值:\n"); scanf("%d",&e); InsertList(L,e); DispList(L); }
实现有序链表A,B的合并,
1)仍保持其有序性
2)改为逆序
#include <cstdio> #include <cstdlib> #define ERROR 0 #define OK 1 typedef int Status; typedef int ElemType; typedef struct Node{ int data; struct Node *next; }LNode,*LinkList; //初始化 Status InitList(LinkList &L){ L=new Node; if(!L) return 0; L->next=NULL; return 1; } void CreateList_L(LinkList &L,int n){ int i; L=new LNode; L->next=NULL; LNode *r,*p; r=L;//刚开始指向头结点 for(i=0;i<n;++i){ p=new LNode; printf("请输入元素:\n"); scanf("%d",&p->data); p->next=NULL; r->next=p;//插入到表尾 r=p;//r指向新的尾节点 } } //遍历 void DispList(LinkList L){//不改动数值可以不引用& LNode *p; p=L->next;//指向第一个节点 printf("->"); while(p)//p!=NULL { printf("%d->",p->data); p=p->next; } } //有序链表的合并 LNode* MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){ LNode *pa,*pb,*pc; pa=La->next; pb=Lb->next; pc=Lc=La; while(pa && pb){ if(pa->data<=pb->data){ pc->next=pa; pc=pa; pa=pa->next; } else{ pc->next=pb; pc=pb; pb=pb->next; } pc->next=pa?pa:pb; delete Lb; } } //逆置 void reverse(LinkList &H) { LNode *p,*q; p=H->next; H->next=NULL; while(p!=NULL){ q=p; p=p->next; q->next=H->next; H->next=q; } } int main(){ int i; LinkList L,S,C;//L:表一, S:表二 C:表一表二合并表三 L=new LNode; S=new LNode; LNode *r,*p; InitList(L); InitList(S); //为表1初始化元素 r=L; for(i=0;i<5;++i){ p=new LNode; p->data=2*i; p->next=NULL; r->next=p;//插入到表尾 r=p;//r指向新的尾节点 } //为表2初始化元素 r=S; for(i=0;i<5;++i){ p=new LNode; p->data=2*i+1; p->next=NULL; r->next=p;//插入到表尾 r=p;//r指向新的尾节点 } printf("表A元素为:\n"); DispList(L); printf("\n----------------------->\n"); printf("表B元素为:\n"); DispList(S); printf("\n----------------------->\n"); printf("表A表B合并后的有序表为::\n"); MergeList_L(L,S,C); DispList(C); printf("\n----------------------->\n"); printf("改为逆序后为:\n") ; reverse(C); DispList(C); }
-------------------实验那么多,老是忘记把笔记存到博客上,争取下次不要忘。2020-03-15 13:22:49

浙公网安备 33010602011771号