第4周、项目3(3)—单链表应用-递增
2015-10-05 16:55
375 查看
文件及代码:
头文件:linklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明
源文件:linklist.cpp,包含实现各种算法的函数的定义
运行结果:
知识点总结:
设计算法完成单链表的逆置,连接和递增的判断。
/* *Copyright(c) 2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:test.cpp *作 者:焦梦真 *完成日期:2015年10月5日 *版 本 号;v1.0 * *问题描述:设计一个算法,判断单链表L是否是递增的。
*输入描述:无 *程序输出:判断结果。
*/ #include <stdio.h> #include <malloc.h> #include "linklist.h" bool increase(LinkList *L) { LinkList *p = L->next, *q; //p指向第1个数据节点 if(p != NULL) { while(p->next != NULL) { q = p->next; //q是p的后继 if (q->data > p->data) //只要是递增的,就继续考察其后继 p = q; else return false; //只要有一个不是后继大于前驱,便不是递增 } } return true; } int main() { LinkList *A, *B; int i; ElemType a[]= {1, 3, 2, 9}; ElemType b[]= {0, 4, 5 ,6, 7, 8}; InitList(A); for(i=3; i>=0; i--) ListInsert(A, 1, a[i]); InitList(B); for(i=5; i>=0; i--) ListInsert(B, 1, b[i]); printf("A: %c\n", increase(A)?'Y':'N'); printf("B: %c\n", increase(B)?'Y':'N'); DestroyList(A); DestroyList(B); return 0; }
头文件:linklist.h,包含定义顺序表数据结构的代码、宏定义、要实现算法的函数的声明
#ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED typedef int ElemType; typedef struct LNode //定义单链表结点类型 { ElemType data; struct LNode *next; //指向后继结点 }LinkList; void CreateListF(LinkList *&L,ElemType a[],int n);//头插法建立单链表 void CreateListR(LinkList *&L,ElemType a[],int n);//尾插法建立单链表 void InitList(LinkList *&L); //初始化线性表 void DestroyList(LinkList *&L); //销毁线性表 bool ListEmpty(LinkList *L); //判断线性表是否为空 int ListLength(LinkList *L); //求线性表长度 void DispList(LinkList *L); //输出线性表 bool GetElem(LinkList *L,int i,ElemType &e); //求线性表某个数据元素值 int LocateElem(LinkList *L,ElemType e); //按元素值查找 bool ListInsert(LinkList *&L,int i,ElemType e); //插入数据元素 bool ListDelete(LinkList *&L,int i,ElemType &e); //删除数据元素 #endif // LINKLIST_H_INCLUDED
源文件:linklist.cpp,包含实现各种算法的函数的定义
#include <stdio.h> #include <malloc.h> #include "linklist.h" void CreateListF(LinkList *&L,ElemType a[],int n)//头插法建立单链表 { LinkList *s; int i; L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点 L->next=NULL; for (i=0; i<n; i++) { s=(LinkList *)malloc(sizeof(LinkList));//创建新结点 s->data=a[i]; s->next=L->next; //将*s插在原开始结点之前,头结点之后 L->next=s; } } void CreateListR(LinkList *&L,ElemType a[],int n)//尾插法建立单链表 { LinkList *s,*r; int i; L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点 for (i=0; i<n; i++) { s=(LinkList *)malloc(sizeof(LinkList));//创建新结点 s->data=a[i]; r->next=s; //将*s插入*r之后 r=s; } r->next=NULL; //终端结点next域置为NULL } void InitList(LinkList *&L) { L=(LinkList *)malloc(sizeof(LinkList)); //创建头结点 L->next=NULL; } void DestroyList(LinkList *&L) { LinkList *p=L,*q=p->next; while (q!=NULL) { free(p); p=q; q=p->next; } free(p); //此时q为NULL,p指向尾结点,释放它 } bool ListEmpty(LinkList *L) { return(L->next==NULL); } int ListLength(LinkList *L) { LinkList *p=L; int i=0; while (p->next!=NULL) { i++; p=p->next; } return(i); } void DispList(LinkList *L) { LinkList *p=L->next; while (p!=NULL) { printf("%d ",p->data); p=p->next; } printf("\n"); } bool GetElem(LinkList *L,int i,ElemType &e) { int j=0; LinkList *p=L; while (j<i && p!=NULL) { j++; p=p->next; } if (p==NULL) //不存在第i个数据结点 return false; else //存在第i个数据结点 { e=p->data; return true; } } int LocateElem(LinkList *L,ElemType e) { LinkList *p=L->next; int n=1; while (p!=NULL && p->data!=e) { p=p->next; n++; } if (p==NULL) return(0); else return(n); } bool ListInsert(LinkList *&L,int i,ElemType e) { int j=0; LinkList *p=L,*s; while (j<i-1 && p!=NULL) //查找第i-1个结点 { j++; p=p->next; } if (p==NULL) //未找到位序为i-1的结点 return false; else //找到位序为i-1的结点*p { s=(LinkList *)malloc(sizeof(LinkList));//创建新结点*s s->data=e; s->next=p->next; //将*s插入到*p之后 p->next=s; return true; } } bool ListDelete(LinkList *&L,int i,ElemType &e) { int j=0; LinkList *p=L,*q; while (j<i-1 && p!=NULL) //查找第i-1个结点 { j++; p=p->next; } if (p==NULL) //未找到位序为i-1的结点 return false; else //找到位序为i-1的结点*p { q=p->next; //q指向要删除的结点 if (q==NULL) return false; //若不存在第i个结点,返回false e=q->data; p->next=q->next; //从单链表中删除*q结点 free(q); //释放*q结点 return true; } }
运行结果:
知识点总结:
设计算法完成单链表的逆置,连接和递增的判断。
相关文章推荐
- 第3周项目4 顺序表应用问题(1)
- [237]Delete Node in a Linked List
- 第四周项目3--单链表应用(3)
- 想开网店?向你推荐最好的开源电子商务平台
- Ubuntu 14.04鼠标光标狂闪问题
- UVA 11027 - Palindromic Permutation
- pom.xml解析
- Android UI SurfaceView的使用-绘制组合图型,并使其移动
- 数据结构实践——猴子选大王
- 第四周【数据结构实践项目——链表 项目5 - 猴子选大王】
- xXx时间屏保3.6
- 第4周 项目3 - 单链表应用(1)
- 快速选择
- 第三周项目三 求集合并集
- 快速选择
- Android UI SurfaceView的使用-绘制组合图型,并使其移动
- (数据挖掘-入门-6)十折交叉验证和K近邻
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- 【第4周 项目5 - 猴子选大王】
- 常用的代码收集,没有任何技术含量,只是填坑的积累