数据结构顺序表定义和实现

来源:互联网 发布:你见过最恐怖的事 知乎 编辑:程序博客网 时间:2024/06/09 17:28

首先是顺序表的抽象数据类型的定义

//  file: sequence.h#define MAXSIZE 100     // 定义顺序表最大的容量为100typedef int datatype;   //给int 取了个别名叫datatypetypedef struct {    datatype arr[MAXSIZE];    int size;}sequence;

接下来是它的大部分算法实现,当然我增加了冒泡排序:

// file: sequence.c#include "sequence.h"#include <stdio.h>#include <stdlib.h>/**     我会遇到这个问题,比如:append(sequence* sequ)和  display(sequence sequ)里面的参数对调下,是否也可以呢,答案是不行的,函数在调用时,会在另外开辟一块空间,如果不传递指针参数的话,函数的调用将是无意义的**//*    顺序表是线性存储,所以下面涉及到的第i个元素或第position位置,i和position取值范围是{0, 1, ..., size-1},当然这只是我理解的一种*///  用C语言实现如下算法,实现如下函数(也叫方法)前,首先最好声明下----------void init(sequence* sequ);  // 初始化顺序表void append(sequence* sequ, datatype x);     // 往顺序表后部插入值为x的元素void display(sequence sequ); // 遍历int isEmpty(sequence sequ); // 判断是否为空,空为1,否则为0int find(sequence sequ, datatype x);int get(sequence sequ, int i);void insert(sequence* sequ, int position, datatype x);void dele(sequence* sequ, int position);     // void sort_sequence(sequence* sequ);void bubble_sort(sequence* sequ); // 冒泡排序void init(sequence* sequ){    sequ->size = 0;}void append(sequence* sequ, datatype x){    if(sequ->size == MAXSIZE)    {        printf("sequence is full, can't append it \n");        exit(1);     }     sequ->arr[sequ->size] = x;    sequ->size = sequ->size + 1; }void display(sequence sequ){    int i;    if(sequ.size == 0)    {        printf("the sequence is empty, print nothing\n");        exit(1);    }    printf("the sequence is:\t");    for(i = 0; i < sequ.size; i++)    {        printf("%5d", sequ.arr[i]);    }}int isEmpty(sequence sequ){    return (sequ.size == 0 ? 1 : 0);}int find(sequence sequ, datatype x){    int i = 0;    if(sequ.size == 0)      {        printf("the sequence is empty, can't find %d \n", x);        exit(1);    }    while(i < sequ.size && sequ.arr[i] != x)    {        i++;    }    return (i < sequ.size ? i : -1);}int get(sequence sequ, int i){    if(i < 0 || i > sequ.size - 1)    {        printf("can't get the %dst value\n");   exit(1);    }    else        return sequ.arr[i];}void insert(sequence* sequ, int position, datatype x){    int i;    if(position > -1 || position < sequ->size)        for(i = sequ->size; i > position; i--)        {            sequ->arr[i] = sequ->arr[i-1];        }    sequ->arr[position] = x;    sequ->size++;       }void delete(sequence* sequ, int position){    int i;    if(position > -1 || position < sequ->size)    {        for(i = position; i < sequ->size - 1; i++)            sequ->arr[i] = sequ->arr[i+1];     }    sequ->size--;}void sort_sequence(sequence* sequ){    if(sequ->size != 0)        bubble_sort(sequ);    printf("\n");    display(*sequ);}void bubble_sort(sequence* sequ){    int i, j, n, temp;    n = sequ->size;    for(i = 1; i < n; i++)        for(j = 0; j < n - i; j++)        {            if(sequ->arr[j] > sequ->arr[j+1])            {                temp = sequ->arr[j];                sequ->arr[j] = sequ->arr[j+1];                sequ->arr[j+1] = temp;              }        }}

下面是顺序表实现方式:

#include <stdio.h>#include "sequence.c"#define MAX 8int main(){    int i;    int a[MAX] = {2, 5, 6, 3, 19, 0, 7, 10};    sequence sequ; // line 1    sequence* sequ_pointer = &sequ; // line 2    // line 2的代码可以不用的,那传递顺序表指针时就用&sequ,经检验使用指针变量sequ_pointer比直接传地址值&sequ更节约时间,这就是使用指针变量的的好处吧     init(sequ_pointer);    for(i = 0; i < MAX; i++)        append(sequ_pointer, a[i]);    display(sequ);    sort_sequence(sequ_pointer);    append(sequ_pointer, 8);    sort_sequence(sequ_pointer);        return 0; } 
0 0
原创粉丝点击