ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

线性表的基本操作

2021-03-28 21:57:08  阅读:138  来源: 互联网

标签:return 线性表 int 元素 next 基本操作 data


文章目录

一. 线性表的顺序存储结构

顺序存储: 是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的;

优点:

不需要为表示表中元素之间的逻辑关系而增加额外的存储空间;

缺点:

插入和删除操作需要移动大量元素+当线性表长度变化过大时,难以确定存储空间的容量 + 容易造成存储空间的’碎片’;

1. 初始化

# define MAXSIZE 20 

typedef int Status;
typedef int ElemType;
typedef struct
{
	ElemType data[MAXSIZE];
	int length; 
}SqList;

顺序存储结构封装属性

(1)存储空间的起始位置: 数组data (其存储位置就是线性表存储空间的存储位置);

(2)线性表的最大存储容量: 数组的长度’MAXSIZE’;

(3)线性表的当前长度: lenght (与数组长度初始化后不变的存储空间不同);

地址计算方法 (从’1’开始的计算方法)

假设ElemType占用的是C个存储单元(字节)

那么线性表中第i+1个数据元素和第i个数据元素的存储位置的关系:

  LOC(ai+1) = LOC(ai) + C 

所以对于第i个数据元素ai的存储位置可以由a1推算得出随机存储结构’O(1)’

  LOC(ai) = LOC(a1) + (i-1)*C

2. 读取元素

将线性表L中的第i个位置(下标为i-1)元素返回

# define ERROR 0
# define OK 1

typedef int Status;
Status GetElem(SqList L,int i,ElemType *e)
{
	if(L->length==0 || i<1 || i>L->length)
	{
		return ERROR;
	}
	*e = L->data[i-1];

	return OK;
}

3. 插入元素

Status ListInsert(SqList *L,int i,ElemType e)
{
	int k;
	if(L->length == MAXSIZE) 
	{
		return ERROR;
	}          
	if(i<1 || i>L->length+1) 
	{
		return ERROR;
	}
	if(i<=L->length) 	
	{
		for(k=L->length-1; k>=i-1; k--)
		{
			L->data[k+1] = L->data[k];
		}
	}
    L->data[i-1] = e;
    L->length++;

	return OK;
}

3. 删除元素

Status ListDelete(SqList *L,int i,ElemType *e)
{
	int k;
	if(L->length == 0)
	{
		return ERROR;
	}
	if(i<1 || i>L->length)
	{
		return ERROR;
	}
	*e = L->data[i-1];
	if(i < L->length)
	{
		for(k=i; k<L->length; k++)
		{
			L->data[k-1] = L->data[k];
		}
	}
	L->length--;
	
	return OK;
}

二. 线性表的链式存储结构

链式存储: 是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的;

优点:

插入或删除元素时很方便,使用灵活,存储空间利用率高;

缺点:

存储密度小(<1),查找和修改需要遍历整个链表;

1. 初始化

typedef struct Node
{
	ElemType data;
	struct Node *next;
}Node;
typedef struct Node* LinkList;

2. 读取元素

Status GetElem(LinkList L,int i,ElemType *e)
{
	int j = 1 ;
	LinkList p;
	p = L->next;
	while(p && j<i) 
    {
    	p = p->next;
        j++;
    }
    if(!p || j>i) 
    {
        return ERROR;
    }
    *e = p->data;
        
    return OK;  
}

3. 插入元素

Status ListInsert(LinkList *L,int i,ElemType e)
{
	int j = 1;
	LinkList p,s; 
	p = *L;
	while(p && j<i) 
	{
		p = p->next;
		j++;
	}
	if(!p || j>i)
	{
		return ERROR;
	}
	s = (LinkList)malloc(sizeof(Node));  
	s->data = e;

	s->next = p->next; 
	p->next = s;

	return OK; 
}

4. 删除元素

Status ListDelete(LinckList *L,int i,ElemType *e)
{
	int j = 1;
	LinkList p,q;  	
	while(p->next && j<i) 
	{	
		p = p->next;
		j++;
	}
	if(!(p->next) || j>i) 
	{
		return ERROR;
	}
	q = p->next;  
	p->next = q->next;  

	*e = q->data;
	free(q);  // 释放内存空间

	return OK; 
}

标签:return,线性表,int,元素,next,基本操作,data
来源: https://blog.csdn.net/qq_51653366/article/details/115287951

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有