您的位置:首页 > 理论基础 > 数据结构算法

数据结构(C语言实现)-线性表(1)(线性表的顺序表示)

2020-06-05 09:58 288 查看

从去年十一月开始学数据结构,学完快半年了,因为就只拿着书看不写代码效果不好,一个月前打算把数据结构所有的代码敲一遍,把代码传上来应该可以督促自己坚持下去吧。电脑里只装了VS2015,所以代码也用它编写。

目录

线性表的顺序表示

//头文件 head.h

#ifndef _HEAD_H    //防止头文件重复包含
#define _HEAD_H

#include<stdlib.h>
#include<stdio.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 3

#endif

单独写这个头文件方便把各个数据结构写进一个工程里,作用是定义几个宏变量和include几个头文件

#include"head.h"

#define list_init_size 80  // 初始分配存储空间(可存储元素数量)
#define list_increament 10  // 存储空间分配增量
typedef int Elemtype;  // 线性表存储元素类型

// 线性表的存储结构
typedef struct{
Elemtype *elem;  // 存储空间基址
int current_size;  // 当前线性表的长度(当前存储元素的个数)
int max_size;  // 当前分配的存储空间大小(最大可存储元素个数)
}SqList;

// 初始化,构造一个空的线性表
int InitList(SqList *L)  //结构体作为函数输入,传入的是结构体的地址
{
L->elem = (Elemtype *)malloc(list_init_size*sizeof(Elemtype));
if(!L->elem)  exit(OVERFLOW);  // 存储空间分配失败
L->cerrent_size = 0;
L->max_size = list_init_size;

return OK;
}

// 返回第i个元素的值,并赋值给变量e
int GetElem(SqList *L,int i,int *e)
{
if (i<1 || i>L->current_size)  return ERROR;
*e = L->elem[i-1];
return OK;
}

// 在第i个元素前插入元素e
int ListInsert(SqList *L , int i , Elemtype e)
{
int *newbase;
int *p;
int *q;
if(i<1 || i>L->current_size+1)  return ERROR;  //c语言从0开始,故第一个元素是0号元素

if(L->current_size >= L->max_size)  // 存储空间不足,增加存储空间
{
newbase = (Elemtype*)realloc(L->elem , (L->max_size + list_increament)*sizeof(Elemtype));
if (!newbase)  exit(OVERFLOW);  // 如果分配失败

L->elem = newbase;  // 更新结构体
L->max_size += list_increment;
}

q = &(L->elem[i-1]);  // 将插入位置i改为数组下标q,下标从0开始
for(p = &(L->elem[L->current_size - 1] ; p>=q ; p--)
*(p+1) = *p;  // 元素依次向后移动
*q = e;
L->current_size +=1;
return L->current_size;
}

// 删除第i个元素,用e返回其值
int ListDelete(Sqlist *L,int i,int e)
{
int *p;
int *q;
if(i<1 || i>L->current_size)  return ERROR;

e = L->elem[i - 1];
p = &L->elem[i - 1];  //  删除位置i改为数组下标形式
for(q = p+1 ; q<=p+(L->current_size - i) ; q++)
*(q - 1) = *q;  // 元素依次前移
L->current_size -= 1;
return e;
}

在给线性表分配的存储空间足够大的情况下:

线性表的顺序存储结构中,每插入或删除一个元素,平均移动表中一半元素,若表长为n,则其插入和删除的时间复杂度为O(n)。

同样,进行比较查找操作时,若表中含有(或不含有)和待查找元素e相同的元素,则最多需比较L.current_size次,最少比较1次,时间复杂度为O(n)。

合并两线性表(取并集),比较并插入一个元素,进行n次基本操作(比较k次,移动n-k个元素),故时间复杂度为O(La.current_size*Lb.current_size);直接合并的时间复杂度为O(n);元素按大小顺序排列的两线性表合并为一个元素按大小顺序排列的线性表,(基本操作为a列表中取一个元素、b列表中取一个元素、比较两元素大小、放入线性表c。共需La.current_size+Lb.current_size个循环),的时间复杂度为O(La.current_size+Lb.current_size)。

而求表长和取第i个元素无需遍历操作,故时间复杂度为O(1)。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: