菜鸟学习历程【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;}}






   
原创粉丝点击