数据结构c语言版 使用线性表的顺序储存结构定义(静态)实现线性表的初

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构c语言版 使用线性表的顺序储存结构定义(静态)实现线性表的初相关的知识,希望对你有一定的参考价值。

数据结构c语言版 使用线性表的顺序储存结构定义(静态)实现线性表的初始化、插入、删除和显示功能

直接上源码吧。
/*线性表功能的实现*/
#include<stdio.h>
//定义常量 存储空间的初始化分配
#define MAXSIZE 20
#define TRUE 1
#define ERROR -1
#define FALSE 0
#define OK 1
//用typedef定义类型
typedef int Status;
typedef int ElemType;
//定义一个结构体类型
typedef struct
ElemType data[MAXSIZE];
int length;
SqList;
//初始化函数
Status initList(SqList *L)
L->length = 0;
return OK;

//返回线性表的长度
Status getListLength(SqList L)
return L.length;

//线性表为空返回true,否则返回false
Status listEmpty(SqList L)
if(L.length == 0)
return TRUE;

return FALSE;

//线性表清空,长度为0
Status clearList(SqList *L)
L->length = 0;
return OK;

//获取指定的元素的值,返回下标为i - 1的元素,赋值给e
Status getElem(SqList L, int i, ElemType *e)
//判断元素位置是否合法[i]
if(i > L.length || i < 1)
printf("查找的位置不正确 \\n");
return ERROR;

//判断线性表是否为空
if(listEmpty(L))
return ERROR;

*e = L.data[i - 1];
return OK;

//在线性表中查找指定的e相等的元素,如果查找成功,返回该元素的下标,否则返回ERROR
Status locateElem(SqList L, ElemType e)
int i;
for(i = 0; i < L.length - 1; i++)
if(L.data[i] == e)
return i;


printf("没有查找到元素 %d 指定的下标\\n",e);
return ERROR;

//自动创建 MAXSIZE 个元素,并赋值为0
Status createList(SqList *L)
int i;
for(i = 0; i < 10; i++)
L->data[i] = 0;

L->length = 10;
return OK;

//在线性表中第i个位置前插入新元素e
Status listInsert(SqList *L, int i, ElemType e)
//判断长度是否可以允许插入新的数据
if(L->length >= MAXSIZE)
printf("空间已满,不能再插入数据\\n");
return FALSE;

//判断插入位置的合法性
if(i < 1 || i > L->length)
printf("插入位置不正确\\n");
return FALSE;

int j;
for(j = L->length - 1; j >= i; j--)
L->data[j] = L->data[j - 1];

L->data[i - 1] = e;
L->length++;
return TRUE;

//删除线性表中第i个元素,成功后表长减1,用e返回其值
Status deleteList(SqList *L, int i, ElemType *e)
//判断线性表是否为空
if(listEmpty(*L))
return ERROR;

//判断删除的位置是否合法
if(i < 1 || i > L->length)
printf("删除位置不合法\\n");
return ERROR;

*e = L->data[i - 1];
for(i; i < L->length; i++)
L->data[i - 1] = L->data[i];

L->length--;
return TRUE;

//遍历线性表
Status listTraverse(SqList L)
int i;
for(i = 0; i < L.length; i++)
printf("%d ",L.data[i]);

printf("\\n");
return OK;

//主程序
int main(void)
SqList L;
ElemType e;
initList(&L);
int option = 1;
int input_number;
int res;
ElemType input_value;
printf("\\n1.遍历线性表 \\n2.创建线性表 \\n3.清空线性表 \\n4.线性表插入 \\n5.查找表中元素 \\n6.判断元素是否在表中 \\n7.删除某个元素 \\n8.线性表长度\\n9.线性表是否为空\\n0.退出 \\n请选择你的操作:\\n");
while(option)
scanf("%d",&option);
switch(option)
case 0:
return OK;
break;
case 1:
listTraverse(L);
break;
case 2:
createList(&L);
listTraverse(L);
break;
case 3:
clearList(&L);
listTraverse(L);
break;
case 4:
printf("请输入插入的位置:");
scanf("%d",&input_number);
printf("\\n");
printf("请输入插入的值:");
scanf("%d",&input_value);
printf("\\n");
listInsert(&L, input_number, input_value);
listTraverse(L);
break;
case 5:
printf("请输入要查找的位置:");
scanf("%d",&input_number);
printf("\\n");
getElem(L, input_number, &input_value);
printf("第%d个元素的值为:%d\\n",input_number,input_value);
break;
case 6:
printf("请输入要查找的元素:");
scanf("%d",&input_value);
printf("\\n");
res = locateElem(L, input_value);
if(res != ERROR)
printf("值为%d在表中的第%d个位置\\n",input_value,input_number);

break;
case 7:
printf("要删除第几个元素?");
scanf("%d",&input_number);
printf("\\n");
deleteList(&L, input_number, &input_value);
listTraverse(L);
break;
case 8:
res = getListLength(L);
printf("线性表的长度是:%d",res);
break;
case 9:
res = listEmpty(L);
if(res)
printf("线性表的是空的");
else
printf("线性表的是不是空的");

break;


return OK;


线性表的特征是:
1. 元素之间是有序的,如果元素存在多个,则第一个元素无前驱,最后一个无后继,其它元素都有且只有一个前驱和后继.
2. 元素个数是有限的. 当n=0是,称为空表
线性表实现方式有两种,分别是顺序存储结构和链式存储结构,它们之间各有优缺点 . 根据需求的不同进行选择不同的存储结构.
线性表存储结构的优缺点
优点:
1. 无须为表中元素之前的逻辑关系而增加额外的存储空间
2. 可以快速的存取表中的任一位置的元素
缺点:
1. 插入和删除操作需要移动大量元素
2. 当线性表长度变化较大时,难以确定存储空间的容量.
3. 造成存储空间的”碎片”.
参考技术A

#include<stdio.h>

#include<malloc.h>

#define MAXSIZE 100

#define TRUE    1

#define FALSE   0

#define OK      1

#define ERROR   0

#define OVERFLOW -2

#define NULL    0

typedef struct LNode

int    data;

struct LNode *next;

*Link,*Position;

typedef struct

Link head,tail;

int    len;

LinkList;

int MakeNode(Link &p,int e)

      

//分配由p指向的值为e的结点,并返回OK; 若分配失败,则返回ERROR

if(!(p=(Link)malloc(sizeof( Link ))))return ERROR;

p->data=e;

p->next=NULL;

return OK;

void FreeNode(Link &p)

//释放p所指的结点

free(p);

p=NULL;

int InitList(LinkList &L)

//构造一个空的线性链表L

Link p;

p=(Link)malloc(sizeof(LNode));

if(!p)return(OVERFLOW);

p->next=NULL;

L.tail=L.head=p;

L.len=0;

return OK;

int ClearList(LinkList &L)

线性表:顺序储存结构

一、定义

一段地址连续的储存单元依次储存线性表的数据元素。

二、特点

1、插入删除时,当在尾部进行,时间复杂度为o(1),其他情况为o(n)
2、存取容易,时间复杂度为o(1),故顺序结构又叫随机存取结构

三、储存结构表示

#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
    ElemType data[MAXSIZE];//最大容量为MAXSIZE的数组
    int length;//数据长度
}SqList;

四、其他操作

1、获得元素:将线性表L第i个位置的元素返回

int getElem(SqList L,int i,ElemType *e)
{
    if(L.length==0||i<1||i>L.length)
        return 0;
    else
        return L.data[i-1];
}

2、插入元素:将线性表L第i个位置插入元素e

int ListInsert(SqList *L,int i,ElemType e)
{
    if(L->length==MAXSIZE)//线性表已满
        return 0;
    if(i<1||i>L->length+1)//插入位置不正确
        return 0;
    if(i<=L->length)//插入数据位置不在队尾
    {
        for(int k=L->length-1;k>=i-1;k--)//第i个位置的后面元素向后移动一位
            L->data[k+1]=L->data[k];
    }
    L->data[i-1]=e;
    L->length++;//元素数量加一
    return 1;
}

3、删除元素

int ListDelete(SqList *L,int i,ElemType *e)
{
    if(L->length==0)//表中元素为空
        return 0;
    if(i<1||i>L->length)//删除位置不正确
        return 0;
    *e=L->data[i-1];
    if(i<L->length)//删除位置不在最后位置
    {
        for(int k=i;k<=L->length-1;k++)//将删除位置后面元素前移
            L->data[k-1]=L->data[k];
    }
    L->length--;//元素数量减一
    return 1;
}

以上是关于数据结构c语言版 使用线性表的顺序储存结构定义(静态)实现线性表的初的主要内容,如果未能解决你的问题,请参考以下文章

数据结构C语言版 —— 顺序表增删改查实现

《数据结构:c语言版》(严蔚敏)知识点整合

数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表

数据结构(C语言版)严蔚敏->顺序表的定义及合并顺序表

数据结构 线性表 用c语言

C语言数据结构——线性表的顺序表示