菜鸟学习历程【11】数据结构
来源:互联网 发布:八字奶 知乎 编辑:程序博客网 时间:2024/06/05 11:36
数据结构
一、线性表
1.定义:定义n个数据元素的有限序列,记作(a1, a2, …, an),ai 是表中数据元素,n 是线性表的长度。
2.特点:
直接前驱:除第一个元素外,其他每一个元素有且仅有一个前驱;
直接后继:除最后一个元素外,其他每一个元素有且仅有一个后继。
二、顺序表
1.定义:将线性表中的元素相继存放在一个连续的存储空间中。
2.特点:可利用一维数组描述存储结构、线性表的顺序存储方式、顺序访问, 可以随机存取 。
下面介绍一个顺序表的程序:
基本功能:元素的插入、定位、遍历、删除、顺序表的判空;
首先是头文件:Sequence.h
#ifndef _SEQUENCE_H_ // #ifndef xxxxxxxx .... #endif 是头文件的固定格式#define _SEQUENCE_H_#define MAXSIZE 10#define FAILURE 100000#define SUCCESS 100001 #define FAUSE 100002#define TRUE 100003typedef int ElemType;struct sequence { ElemType *data; int size; int length;};typedef struct sequence SeList;int InitList(SeList *s); //初始化函数int EmptyList(SeList s); //顺序表判空函数int LengthList(SeList s); //顺序表长度求取函数int InsertList(SeList *s, int i, ElemType e); //指定位置插入元素函数int LocateElem(SeList s, int e, int (*compare)(ElemType, ElemType)); //定位函数int GetElem(SeList s, int p); //获取元素内容函数int ListTraverse(SeList s, void(*compare)(ElemType)); //遍历函数int DeleteList(SeList *s, int pos); //删除函数#endif
main.c
int equal(ElemType a, ElemType b) //equal 与 large 为函数指针,后面会调用到{ return (a == b) ? TRUE : FAUSE;}int large(ElemType a, ElemType b){ return (a <= b) ? TRUE : FAUSE;}void visit(ElemType e) //visit 与 add 为函数指针,后面会调用{ printf("%d ",e);}void add(ElemType e){ printf("%d ", e + 1);}int main(){ SeList Slist; //定义一个SeList 的变量 int ret, i, place, val, pos, j; //ret 变量用来接各个函数的返回值 int a[10]={0};//********初始化部分************* ret = InitList(&Slist); //初始化用使用到地址传递,值传递分配的内存并不会保留 if(ret == SUCCESS) //初始化判断 { printf("Init SUCCESS\n"); } else printf("Init FAULIE\n"); for(i = 0;i < MAXSIZE;i++) //使用for循环调用Insert函数插入0~9十个数 { ret = InsertList(&Slist, i, i + 1); if(SUCCESS == ret) printf("Insert %d Success\n", i); else printf("Insert %d Failure\n", i); }//***********判断是否为空顺序表*********ret = EmptyList(Slist);if(TRUE == ret){printf("List is empty\n");}else{printf("List is't empty\n");}printf("Length:%d\n", LengthList(Slist)); //调用length求取函数,输出长度//*************获取指定位置元素***********place = 3; //指定获取的位置为3ret = GetElem(Slist, place);if(ret == FAUSE) //提示获取失败、获取成功打印{printf("Elem %d is not found\n", place);}else{printf("Elem %d is %d\n", place, ret);}//************遍历顺序表,实现函数功能并打印**********ret = ListTraverse(Slist, add); //add为函数指针,实现加一操作再输出if(ret == SUCCESS){printf("SUCCESS\n");}else{printf("Failure\n");}//*********返回顺序表中data内容满足函数要求的下标**********val = 4; ret = LocateList(Slist, val, equal); //设定值为4,返回满足equal函数要求的元素下标if(ret == FAUSE){printf("NOT FOUND\n");}else{printf("%d is %dth\n", val, ret);}//*************获取值,按顺序插入顺序表中***********//for(i = 0;i < 10;i++) //这两部分要与上面分开,是单独加的功能//{ //终端获取指定插入值,并按从小到大排列// printf("Please input a number:\n");//scanf("%d", &a[i]);//ret = LocateList(Slist, a[i], large);//InsertList(&Slist, ret, a[i]);//}//ListTraverse(Slist, visit);//printf("\n");//******从终端获取指定删除的位置,实现删除的功能********// printf("Please input the position:\n");// scanf("%d", &pos);// ret = DeleteList(&Slist, pos);// j = 0;// if(ret == FAUSE)// {// printf("Unkown!\n");// }// while(Slist.length != 0)// {// printf("%d ", Slist.data[j]);// Slist.length--;// j++;// }// printf("\n"); return 0;}
接口部分:Sequence.c#include <stdio.h>#include <stdlib.h>#include "Sequence.h"int InitList(SeList *s){ //为data分配10个ElemType单位的内存,存放十个数据s->data = (ElemType *)malloc(sizeof(ElemType) * MAXSIZE);if(s->data == NULL) //分配内存检查{return FAILURE;}s->size = MAXSIZE;s->length = 0;return SUCCESS;}int InsertList(SeList *s, int i, ElemType e){int k; //判断输入的插入位置是否合法if((i < 0 || i >= MAXSIZE) || s->length > MAXSIZE){return FAILURE;}for(k = 0;k < s->length - i;k++ ) //将插入位置之后的所有元素依次向后挪一位{s->data[s->length - k] = s->data[s->length - k -1];}s->data[i] = e; //挪位完成后,插入数据s->length++; //将表的长度加1,size是表的容量,即最大长度return SUCCESS;}int EmptyList(SeList s) //判断表的长度是否为0,0即空表{return (s.length == 0) ? TRUE : FAUSE;}int LengthList(SeList s){return s.length;}int GetElem(SeList s, int p){int ret = 0;if(p < 0 || p >= 10) //判断输入的获取位置是否合法{ return FAUSE;}ret = s.data[p]; return ret;}int ListTraverse(SeList s,void (*look)(ElemType)) //遍历满足函数指针要求的元素{int i;for(i = 0;i < s.length;i++){look(s.data[i]);}return SUCCESS;}int LocateList(SeList s, int e,int (*compare)(ElemType, ElemType)){int i = 0;for(i = 0;i < s.length;i++){if(compare(e, s.data[i]) == TRUE)break;}return i;}int DeleteList(SeList *s, int pos){int i;if(pos < 0 || pos > 10){return FAUSE;}else{for(i = pos;i < s->length;i++){s->data[i] = s->data[i+1];}s->length--;return SUCCESS;}}
阅读全文
0 0
- 菜鸟学习历程【11】数据结构
- 菜鸟之计算机学习历程
- java菜鸟的学习历程
- C_sharp:一个菜鸟学习历程
- 菜鸟学习历程【12】链表
- 菜鸟学习历程【21】线程
- 数据结构的菜鸟学习
- Android学习历程-从菜鸟开始
- 菜鸟的Linux历程-学习大纲
- 小菜鸟学习历程之ToolBar
- c sharp 菜鸟的学习历程
- c sharp 菜鸟的学习历程2
- c sharp 菜鸟的学习历程3
- c sharp 菜鸟的学习历程4
- 菜鸟学习历程【5】约瑟夫环
- 菜鸟学习历程【6】关键字、指针
- 菜鸟学习历程【9】结构体
- 菜鸟学习历程【14】停车场项目实战
- 驱动开发学习笔记(1)–INF文件-1
- arcgis10.2制作符号并链接符号库
- oracle 登陆密码忘记措施
- vim
- Azkaban-开源任务调度程序(使用篇)
- 菜鸟学习历程【11】数据结构
- blockcanary UI卡顿优化框架源码解析
- 【JavaScript学习】表单脚本:介绍
- Qt 开机自启动
- 华为荣耀6--usb共享网络 设置
- 混淆Android的jar包
- nodeJS
- activiti工作流对表的理解
- java web考试管理js倒计时控制