线性表学习归纳总结二:线性表顺序存储实现

来源:互联网 发布:帝国cms源码 编辑:程序博客网 时间:2024/05/08 05:15

线性表顺序存储实现


  • 顺序表的存储结构
    <span style="font-size:14px;">#define MAXSIZE 100typedef int datatype;typedef struct{datatype a[MAXSIZE];  //定义一个大小为100的int类型数组int size;//size是存储这个数组中有意义数据的个数}sequence_list;</span>
  • 顺序表基本实现
    <span style="font-size:14px;">void init (sequence_list *slt);//顺序表的初始化——置空表void append (sequence_list *slt, datatype x);//在顺序表后部插入值为x的结点void display (sequence_list *slt);//打印顺序表的各结点值int empty(sequence_list slt);//判断顺序表是否为空int find(sequence_list slt, datatype x);//查找顺序表中值为x的结点位置datatype get(sequence_list slt, int i);//取得顺序表中第i个结点的值void insert(sequence_list *slt, datatype x, int position);//在顺序表的position位置插入值为x的结点void dele(sequence_list *slt, int position);//删除表中第position位置的结点</span>

  • sequlist.c文件
    <span style="font-size:14px;">#include <stdlib.h>#include <stdio.h>#include "sequlist.h"/************************************************************************//* 函数功能: 顺序表的初始化——置空表                                      *//* 函数参数: 指向sequence_list型变量的指针变量slt                        *//* 函数返回值:空                                                        *//* 文件名:sequlist.c, 函数名:init()                                    *//************************************************************************/void init (sequence_list *slt){slt->size = 0;for (int i=0; i<MAXSIZE; i++){slt->a[i] = 0;}}/************************************************************************//* 函数功能: 在顺序表后部进行插入操作*//* 函数参数: 指向sequence_list型变量的指针slt*//*  datatype类型的变量x*//* 函数返回值: 空*//* 文件名: sequlist.c, 函数名: append()*//************************************************************************/void append (sequence_list *slt, datatype x){if (slt->size == MAXSIZE){printf("顺序表是满的!");exit(1);}slt->a[slt->size] = x;//将x值写入顺序表后面slt->size = slt->size + 1;//slt->size指向的是顺序表中当前存储数值的下一个位置}/************************************************************************//* 函数功能: 打印顺序表的各结点值*//* 函数参数: sequence_list型变量slt*//* 函数返回值: 空*//* 文件名: sequlist.c,函数名: display()*//************************************************************************/void display (sequence_list *slt){int i;if (!slt->size){printf("\n顺序表的空的!");}else{for (i=0;i<slt->size;i++){printf("%c",slt->a[i]);//printf("%5d",slt->a[i]);}}printf("\n");}/************************************************************************//* 函数功能:判断顺序表是否为空*//* 函数参数:sequence_list型变量slt*//* 函数返回值: int类型。 1表示空,0表示非空*//* 文件名: sequlist.c,函数名: empty()*//************************************************************************/int empty(sequence_list slt){return(slt.size==0 ? 1 : 0);}/************************************************************************//* 函数功能: 查找顺序表中值为x的结点位置*//* 函数参数: sequence_list型变量slt,datatype型变量x*//* 函数返回值:int类型。返回x的位置值,-1表示没有找到*//* 文件名: sequlist.c,函数名:find()*//************************************************************************/int find(sequence_list slt, datatype x){int i = 0;while (i<slt.size && slt.a[i] != x) //i从0初始位置开始遍历,循环在i遍历完整个顺序表停止,或者在查找到x停止,并显示查找到的当前i值{i++;}return(i<slt.size ? i : -1);}/************************************************************************//* 函数功能: 取得顺序表中的第i个结点的值*//* 函数参数: sequence_list型变量slt,int型变量i*//* 函数返回值: datatype类型。返回第i个结点的值*//* 文件名:sequlist.c,函数名: get()*//************************************************************************/datatype get(sequence_list slt, int i){if (i<0 || i>=slt.size){printf("\n指定位置的结点不存在!");exit(1);} else{return slt.a[i];}}/************************************************************************//* 函数功能: 在顺序表的position位置插入值为x的结点*//* 函数参数: 指向sequence_list型变量的指针slt*//* datatype型变量x,int型变量position*//* 函数返回值: 空*//* 文件名: sequlist.c,函数名: insert()*//************************************************************************/void insert(sequence_list *slt, datatype x, int position){int i;if (slt->size == MAXSIZE){printf("/n顺序表是满的!没法插入!");exit(1);}if (position<0 || position>slt->size){printf("/n指定的插入位置不存在!");exit(1);}for (i=slt->size; i>position; i--) //这个循环里面是将position开始的数组值移到下一个位置{slt->a[i] = slt->a[i-1];}slt->a[position] = x;slt->size++;}/************************************************************************//* 函数功能: 删除顺序表中第position位置的结点*//* 函数参数: 指向sequence_list型变量的指针变量slt*//* int型变量position*//* 函数返回值: 空*//* 文件名:sequlist.c,函数名:dele()*//************************************************************************/void dele(sequence_list *slt, int position){int i;if (slt->size == 0){printf("/n顺序表是空的!");exit(1);}if (position<0 || position>=slt->size){printf("/n指定的删除位置不存在!");exit(1);}for (i=position; i<slt->size; i++)//将position位置之后的数组数据往前移动一个位置{slt->a[i] = slt->a[i+1];}slt->size--;}</span>
测试main函数为:
<span style="font-size:14px;">#include <stdio.h>#include <stdlib.h>#include "sequlist.h"void main(void){sequence_list sqlst, *p_sqlst;//顺序表初始化init(&sqlst);p_sqlst = &sqlst;//利用在顺序表后面插入元素的方法建立一个新的顺序表int getin;while (scanf("%d", &getin)==1 && sqlst.size<MAXSIZE) {append(p_sqlst, getin);}display(p_sqlst);  //打印输出//可以循环查找的函数体int search_num;puts("输入待查找元素");while (scanf("%d", &search_num) == 1){printf("待查找元素%d的结点位置为%d\n", search_num, find(sqlst, search_num));puts("输入待查找元素");}//取得顺序表中第i个结点的值int i;puts("输入数值i");while(scanf("%d", &i) == 1){printf("顺序表中第%d个结点的值为%d\n", i, get(sqlst, i));puts("输入数值i");}//在顺序表的position位置插入值为x的结点int position, x;puts("输入插入位置positon和插入值x");while(scanf("%d, %d", &position, &x) == 2){insert(p_sqlst, x, position);puts("插入结果为:");display(p_sqlst);puts("输入插入位置positon和插入值x");}//删除表中第position位置的结点int dele_position;puts("输入待删除结点位置position");while (scanf("%d", &dele_position) == 1){dele(p_sqlst, dele_position);puts("删除结果为:");display(p_sqlst);puts("输入待删除结点位置position");}system("pause");}</span>

运行结果:


0 0
原创粉丝点击