数据结构1.1线性表的实现(顺序存储结构)

 一、

1、顺序表的优点:

(1)存储空间连续,方便随时访问; 

(2)结构简单,易于理解;

(3)易于尾插或尾删和修改;

2、顺序表的缺点:

(1)顺序存储空间容易溢出,不便扩充;

(2)插入和删除必须移动大量元素;

二、顺序表的定义:

(1)数组静态分配(一开始就定下大小):

#define size 10

typedef struct{
	char isbn[20];
	char name[20];
	float price;
}Book;

typedef struct{
	Book elem[size];
	int length;//当前长度 
}sqlist;

(2)数组动态分配:

#define size 10

typedef struct{
	char isbn[20];
	char name[20];
	float price;
}Book;

typedef struct{
	Book *elem;
	int length;//当前长度 
}sqlist;

此时就要:

sqlist L;
L.elem=(Book*)malloc(sizeof(Book)*size);

三、涉及的函数

(1)构造一个空的线性表 ;

int Init_list(sqlist *L)
{
    L->elem = (Book *)malloc(sizeof(Book) * size);
    if (!L->elem) {
        exit(-1); 
    }
    L->length = 0;
    return 1;
}

(2)销毁线性表;

void Destroy_list(sqlist *L)
{
    if (L->elem) {
        free(L->elem);
    }
}

(3)将线性表置空

void Clear_list(sqlist *L)
{
    L->elem = 0;
}

(4)返回线性表中的元素个数(长度)

int List_length(sqlist *L)
{
    return (L->length);
}

(5)判断线性表是否为空,若是返回1,不是返回0

int List_empty(sqlist L)
{
	if(L.elem==0)
	{
		return 1;
	}else
	{
		return 0;
	}
}

 (6)用e返回线性表L中的第i个元素的值(1<=i<=Listlength(L))成功返回1,失败返回0 

int Get_elem(sqlist *L, int i, Book *e)
{
    if (i < 1 || i > L->length) {
        return 0;
    }
    *e = L->elem[i - 1];
    return 1;
}

(7)查找与指定值相同的e的位置,若找到,返回位置序号,否则返回0 

int Locate_elem(sqlist *L, Book e)
{
    int i;
    for (i = 0; i < L->length; i++) {
        if (memcmp(&L->elem[i], &e,
                   strlen(e.isbn) + strlen(e.name) + sizeof(e.price)) == 0) {
            return (i + 1);
        }
    }
    return 0;
}

(8)在第i个位置插入数据元素e,L的长度加一 ,成功返回1,失败返回0

int List_insert(sqlist *L, int i, Book e)
{
    if (i < 1 || i > L->length + 1 || L->length == size) {
        return 0;
    }
    int j;
    for (j = L->length-1; j >= i-1; j--) {
        L->elem[j+1] = L->elem[j];
    }
    L->elem[i - 1] = e;
    L->length++;
    return 1;
}

(9)删除第i个数据元素,L长度减一 ,成功返回1,失败返回0

int List_delete(sqlist *L, int i)
{
    if (i < 1 || i > L->length) {
        return 0;
    }
    int j;
    for (j = i; j < L->length-1; j++) {
        L->elem[j - 1] = L->elem[j];
    }
    L->length--;
    return 1;
}


 

注:(1)假设线性表中每个元素有占q个存储单元,第i个数据元素的存储位置和第i+1个数据元素的存储位置之间满足关系:

       Loc(ai+1)=Loc(ai)+b            即:Loc(ai)=Loc(a1)+(i-1)*b

eg:如果每个元素占8个存储单元,ai 的存储位置是2022,则 ai+1 的存储位置是2030;

你可能感兴趣的:(编程学习笔记)