严蔚敏版数据结构所有算法代码
更新时间:2023-05-03 02:09:01 阅读量: 实用文档 文档下载
严蔚敏版数据结构所有算法代码
------------------------线性数据结构-----------------------------
2013年9月//线性表、链表
//栈、队列
//数组、广义表
//串
-------------------------线性表----------------------
typedef struct
{
char name[20];//注意如果应用指针的形式
//在初始化每个结点时一定要先为结点中的每个变量开辟内存空间
char sex;
char addr[100];
unsigned int age;
char phonenum[20];
}node;//结点描述
typedef struct
{
node *p;
int length;//当前顺序表长度
int listsize;//当前分配的线性表长度
}list;//线性表描述
list L;//定义一个线性表
int initlist(list &l)//构造一个空的线性表
{
l.p=(node*)malloc(LIST_INIT_SIZE*sizeof(node));
if(!(l.p))
exit(1);
l.length=0;
l.listsize=LIST_INIT_SIZE;
return true;
}
void destroylist(list &l)//销毁线性表操作
{
if(l.p!=NULL)
{
free(l.p);
printf("销毁成功!\n");
}
else
1
printf("线性表不存在!\n");
}
int clearlist(list &l)//将线性表置空操作
{
if(l.p==NULL)
{
printf("线性表不存在!\n");
return false;
}
else
{
free(l.p);
l.p=(node*)malloc(l.listsize*sizeof(node));
l.length=0;
}
return true;
}
int listempty(list &l)//判断线性表是否为空表
{
if(l.p==NULL)
return true;
else
return false;
}
int getelem(list &l,int i,node &e)//用e返回表中第i个数据元素
{
if(l.p==NULL)
return false;
else
e=l.p[i-1];
return true;
}
int priorelem(list &l,int i,node &pre_e)//得到第i个元素的前驱元素{
if(i==0||l.p==NULL)
return false;
else
pre_e=l.p[i-1];
return true;
}
int nextelem(list &l,int i,node &next_e)//得到表中第i个元素的后继元素{
if(i>=l.length||l.p==NULL)
return false;
2
else
next_e=l.p[i+1];
return true;
}
int insertlist(list &l,int i,node &e)//将元素e插入到表l中第i个元素的后面
{
node *q,*k;
if(i<1||i>l.length+1)
return false;
if(l.length>=l.listsize)
{
l.p=(node
*)realloc(l.p,(l.listsize+LISTINCREMENT)*sizeof(node));
if(!l.p)
exit(1);
l.listsize+=LISTINCREMENT;
}
k=&l.p[i-1];
for(q=&l.p[l.length-1];q>k;q--)
*(q+1)=*q;
*k=e;
l.length++;
return true;
}
int deletelist(list &l,int i,node &e)//删除表中第i个元素并用e返回其值
{
node *q;
int j=i-1;
if(i<1||i>l.length)
return false;
e=l.p[i-1];
for(q=&l.p[i-1];j *q=*(++q); l.length--; return true; } void mergerlist(list la,list lb,list &lc)//归并两个按非递减排列的线性表 { int la_len,lb_len,i=1,j=1,k=0; node ai,bj; la_len=la.length; 3 lb_len=lb.length; while(i<=la_len&&j<=lb_len) { getelem(la,i,ai); getelem(lb,j,bj); if(ai.a<=bj.a) { insertlist(lc,++k,ai); i++; } else { insertlist(lc,++k,bj); j++; } } while(i<=la_len) { getelem(la,i,ai); insertlist(lc,++k,ai); i++; } while(j<=lb_len) { getelem(lb,j,bj); insertlist(lc,++k,bj); j++; } } int ListAscendingOrder(list &l)//按结点中某一元素的比较升序排列线性表中的结点 { node e; int i,j; if(l.p==NULL||l.length==1) return ERROR; for(i=0;i for(j=i+1;j if(l.p[i].num>=l.p[j].num) { e=l.p[i]; l.p[i]=l.p[j]; l.p[j]=e; } 4 return OK; }//省略降序排列 void MergerList(list la,list lb,list &lc)//将两线性表升序排列后再归并{ node *q,*k,e1; int i=0,j=0,m=0,n; ListAscendingOrder(la); ListAscendingOrder(lb); printf("表a升序排列后为:\n"); for(i=0;i printf("%d ",la.p[i].num); printf("\n"); printf("表b升序排列后为:\n"); for(i=0;i printf("%d ",lb.p[i].num); printf("\n"); i=0; while(i { if(la.p[i].num<=lb.p[j].num) { e1=la.p[i]; i++; } else { e1=lb.p[j]; j++; } if(e1.num!=lc.p[lc.length-1].num) InsertList(lc,++m,e1); } if(i while(i { if(la.p[i].num!=lc.p[lc.length-1].num) InsertList(lc,++m,la.p[i]); i++; } if(j while(j { if(lb.p[j].num!=lc.p[lc.length-1].num) InsertList(lc,++m,lb.p[j]); 5 j++; } printf("按升序排列再归并两表为:\n"); for(n=0;n printf("%d ",lc.p[n].num); printf("\n"); } ----------------------链表----------------------------- typedef struct { int num; }node; typedef struct LIST { node data; struct LIST *next; }list,*slist; int CreatList(slist &head)//此处应为只针对的引用 { head=(list *)malloc(sizeof(list)); if(!head) return ERROR; head->next=NULL; return OK; } void InvertedList(slist &head1,slist &head2) {//构造新表逆置单链表函数 list *p,*q; p=head1->next; q=p->next; if(p==NULL) printf("链表为空无法实现逆置操作\n"); else { while(q!=NULL) { p->next=head2->next; head2->next=p; p=q; q=q->next; } p->next=head2->next; head2->next=p; printf("逆置成功!?\n"); 6 } } void InsertList(slist &head,node &e)//此处应为指针的引用{//而不应该是list *head list *p,*q; p=(list *)malloc(sizeof(list)); q=head; while(q->next!=NULL) q=q->next; p->next=q->next; q->next=p; p->data=e; } void InvertedList(sqlist &head) {//-------不构造新表逆置单链表函数---------// list *p,*q,*k; p=head->next; q=p->next; k=q->next; p->next=NULL; while(k!=NULL) { q->next=p; p=q; q=k; k=k->next; } q->next=p; head->next=q; } //----交换链表中第i个和第j个结点,函数实现如下——// int SwapListNode(sqlist &head,int i,int j) { int m,n,m1,n1,sum=0; list *p,*q,*k,*c,*d,*ba; ba=head->next; while(ba!=NULL) { sum++; ba=ba->next; } if(i==j||i>sum||j>sum||i<1||j<1) { printf("所要交换的两个结点有误!\n"); 7 return ERROR; } if(i { m=i; n=j;} else { m=j;n=i;} p=head;q=head; for(m1=1;m1<=m;m1++) p=p->next; for(n1=1;n1<=n;n1++) q=q->next; if(p->next==q) {//如果结点相邻 k=head; while(k->next!=p) k=k->next; //相邻两结点的交换 p->next=q->next; q->next=p; k->next=q; } else {//如果结点不相邻 k=head;c=head; while(k->next!=p) k=k->next; while(c->next!=q) c=c->next; d=p->next; //不相邻两结点之间的交换 p->next=q->next; c->next=p; k->next=q; q->next=d; } return OK; } //-----将链表中结点按结点中某一项大小升序排列,函数实现如下-----// int AscendingList(sqlist &head) { int m,n,sum=0,i,j; list *p,*q,*k; k=head->next; while(k!=NULL) 8 { sum++; k=k->next; } for(i=1;i for(j=i+1;j<=sum;j++) { p=head->next; m=1; while(m!=i) { m++; p=p->next; } q=head->next; n=1; while(n!=j) { n++; q=q->next; } if(p->data.exp>q->data.exp)//如果按exp降序排列,则应将>改为<; SwapListNode(head,i,j); } return OK; } //-----将两链表合并为一个链表------// int AddList(sqlist &head1,sqlist &head2,sqlist &head3) {//已将表head1和表head2按某一项升序排列过 sqlist p,q; node e; p=head1->next; q=head2->next; while(p!=NULL&&q!=NULL) { if(p->data.exp { InsertList(head3,p->data); p=p->next; } else if(p->data.exp>q->data.exp) { 9 InsertList(head3,q->data); q=q->next; } else if(p->data.exp==q->data.exp) { e.coefficient=p->data.coefficient+q->data.coefficient; e.exp=p->data.exp;//e.exp=q->data.exp; InsertList(head3,e); p=p->next; q=q->next; } } if(p!=NULL) while(p!=NULL) { InsertList(head3,p->data); p=p->next; }//如果p中有剩余,则直接将p中剩余元素插入head3中if(q!=NULL) while(q!=NULL) { InsertList(head3,q->data); q=q->next; }//如果q中有剩余,则直接将q中的剩余元素插入head3中 return 0; } -----------------------栈------------------------------ //---------利用栈结构实现数制之间的转换------书3.2.1// typedef struct { int num; }node; typedef struct { node *base; node *top; int stacksize; }stack;//顺序栈结构定义 int CreatStack(stack &stackll) { stackll.base=(node *)malloc(INITSTACKSIZE*sizeof(node)); if(!stackll.base) exit(OVERFLOW); 10 stackll.top=stackll.base; stackll.stacksize=INITSTACKSIZE; return OK; } void push(stack &s,node e) {//进栈操作 if(s.top-s.base>=s.stacksize) { s.base=(node *)realloc(s.base,(s.stacksize+INCRESTACKMENT)*sizeof(node)); if(!s.base) exit(OVERFLOW); s.top=s.base+s.stacksize;//可以不写此语句; s.stacksize+=INCRESTACKMENT; } *(s.top++)=e;//*s.top++=e; } void pop(stack &s,node &e) {//出栈操作 if(s.top==s.base||s.base==NULL) printf("信息有误!\n"); else e=*--s.top; } //-------取栈顶元素函数------// void gettop(stack &s,node &e) { if(s.base==s.top) printf("栈为空,无法取得栈顶元素!\n"); else { e=*(s.top-1); } } //-----栈的应用:括号匹配的检验------书3.2.2// //省略了大部分上述已有代码// int zypd(char c) {//判断是否为左括号字符 if(c=='['||c=='{'||c=='(') return OK; else return ERROR; } int main(void) { 11 stack s; node e1,e2,e3; char st[INITSTACKSIZE]; int i=0,j; CreatStack(s); printf("请输入括号字符,以'#'做结束符:"); scanf("%c",&st[i]); while(st[i]!='#') { i++; scanf("%c",&st[i]); } if(!zypd(st[0])) printf("输入字符不合法!\n"); else { for(j=0;j { if(zypd(st[j])) {//如果是左括号则将此字符压入栈中 e1.c=st[j]; push(s,e1); } else {//如果当前st[j]元素不是左括号 //则取出栈顶元素,比较栈顶元素与当前st[j]元素是否项匹配 //如果匹配,则栈顶元素出栈 gettop(s,e2); if(e2.c=='['&&st[j]==']'||e2.c=='{'&&st[j]=='}'||e2.c=='('&&st[j] ==')') pop(s,e3); else { printf("括号验证失败!\n"); break; } } } if(s.top==s.base)//当循环结束时,如果栈为空栈说明输入的括号合法printf("括号验证成功!\n"); } getchar(); system("pause"); 12 return 0; } //----------链栈描述---------// typedef struct Node { int num; struct Node *next; }node; typedef struct { Node *top; Node *base; }stack; void InitStack(stack &s) { s.base=(Node *)malloc(sizeof(node)); if(!s.base) exit(1); else { s.base->next=NULL; s.top=s.base; } } void InsertStack(stack &s,node e) { node *p; p=(node *)malloc(sizeof(node)); if(!p) exit(1); else { *p=e; p->next=s.top; s.top=p; } } void DeleteStack(stack &s,node &e) { node *p; if(s.top==s.base) printf("栈为空!\n"); else { 13 p=s.top; s.top=s.top->next; e=*p; free(p); } } --------------------队列---------------------- //------链队列的描述及操作-------// typedef struct Node { int a; struct Node *next; }Qnode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; void InitQueue(LinkQueue &Q) { Q.front=(Qnode *)malloc(sizeof(Qnode)); if(!Q.front) exit(1); Q.rear=Q.front; Q.front->next=NULL; } void InsertQueue(LinkQueue &Q,Qnode e) { QueuePtr p; p=(Qnode *)malloc(sizeof(Qnode)); if(!p) exit(1); *p=e; p->next=NULL; Q.rear->next=p; Q.rear=p; } void DeleteQueue(LinkQueue &Q,Qnode &e) { Qnode *p; if(Q.front==Q.rear) printf("队列为空!\n"); else { 14 p=Q.front->next; e=*p; Q.front->next=p->next; if(p==Q.rear) Q.rear=Q.front; free(p); } } //-------------循环队列---------------// typedef struct node { int data; struct node *next; }node; typedef struct queue { node *base; int front; int rear; }Queue; int tag; void InitQueue(Queue &Q) { Q.base=(node *)malloc(MAX*sizeof(node)); if(!Q.base) exit(1); Q.front=Q.rear=0; tag=0; } void InsertQueue(Queue &Q,node e) { if(tag==1&&Q.front==Q.rear) printf("循环队列已满!\n"); else { Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAX; if(Q.rear==Q.front) tag=1; } } void DeleteQueue(Queue &Q,node &e) { if(tag==0&&Q.front==Q.rear) 15
正在阅读:
严蔚敏版数据结构所有算法代码05-03
大学物理 力学计算题09-24
当代大学生社会责任意识调查报告10-30
质检员考试题库答案06-01
2016尔雅世界建筑史答案05-31
我的云南之旅作文500字07-13
灯作文350字07-13
中级维修工实训考试03-01
2014年全国各地中考数学真题分类解析汇编:05 二元一次方程11-17
包衣机说明书10-25
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 数据结构
- 算法
- 代码
- 所有
- 蔚敏版
- 2015年中考英语模拟试题
- 2020年全县建设工程安全隐患大排查暨危大工程专项检查第四检查组检查小结-其他工作总结范文
- 青少版新概念英语1B教学大纲
- 【CN110208591A】一种低静态电流的电压检测电路及汽车【专利】
- 六郎庄工程二标段小市正施工组织设计
- 透射电子显微镜项目可行性报告(2013年发改委评审通过案例范文)-专家免费咨询
- 2016年上海市虹口区中考数学二模试卷
- 最新办丧事三天具体流程3篇
- 常识判断----马克思主义哲学
- 最新.尔雅音乐鉴赏章节答案
- 【必备】教学计划模板合集七篇
- 公司员工思想动态调研报告
- (完整版)临床试验知情同意书模板
- 电力通信网风险评价方法研究论文
- 小学生猜谜语活动方案1
- 临床试验知情同意书模板
- 农民工劳务合同协议书
- 不得不看!vivo手机如何清理微信存储空间?
- 单片微机原理及应用-徐春辉第5章--习题答案
- 对外经贸公司财务管理课件3 time value