线性表的链式表示和实现
线性表的顺序存储可以随机存取表中任一元素,缺点是在做插入或删除操作时,需要移动大量的元素。
线性表的链式存储不要求逻辑上相邻的元素在物理位置上也相邻,在做插入或删除操作时,不需要移动元素,但也失去了随机存取的特点。
1 线性链表
用一组任意的存储单元存储线性表的数据元素。整个链表的存取必须从头指针开始,头指针指向链表的第一个结点(即第一个数据元素的存储映像)的存储位置,最后一个元素没有直接后继,则线性链表中最后一个结点的指针为NULL。
上图为带头结点的非空单链表
/*带有头指针的单链表*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int elemType;
typedef struct LNode{
elemType data;
struct LNode *next;
}LNode,*linkNode;
typedef struct{
linkNode head;
int length;
} linkList;
/*创建结点,分配内存*/
void makeNode(linkNode *p,elemType e){
*p = (linkNode)malloc(sizeof(LNode));
if(!(*p)){
printf("空间分配失败!");
exit(0);
}
(*p)->data = e;
return;
}
/*释放结点空间*/
void freeNode(linkNode *p){
free(*p);
*p = NULL;
}
/*取头结点*/
linkNode getHead(linkList *L){
return L->head;
}
/*取当前结点p的后继结点*/
linkNode getNext(linkNode p){
return p->next;
}
/*判断当前链表是否为空链表*/
int listEmpty(linkList *L){
return getHead(L)->next == NULL ? 1: 0;
}
/*根据序号,获得对应的结点元素*/
linkNode getElem(linkList *L,int i){
if(i<0||i>L->length+1){
printf("查找的结点不存在!");
exit(0);
}else{
int j = 1;
linkNode e = getHead(L);
while(j< i && e){
e = e->next;
j++;
}
return e;
}
}
/*初始化链表*/
void initList(linkList *L){
linkNode p = (linkNode)malloc(sizeof(LNode));
if(p){
p->next=NULL;
L->length = 0;
L->head = p;
printf("空间分配成功!\n");
}else{
printf("空间分配失败!\n");
}
}
/*清空链表*/
void clearList(linkList *L){
linkNode p = getHead(L);
linkNode q;
while(p->next == NULL){
q = p;
p = p->next;
freeNode(&q);
}
p->next = NULL;
L->length = 0;
return;
}
/*销毁链表*/
void destroyList(linkList *L){
clearList(L);
freeNode(&L->head);
return;
}
/*在指定位置插入元素*/
void listInsert(linkList *L,int i,elemType e){
linkNode p = getElem(L,i);
linkNode s;
makeNode(&s,e);
s->next = p->next;
p->next = s;
L->length++;
return;
}
/*删除指定位置的元素*/
void listDelete(linkList *L,int i,elemType e){
linkNode p = getElem(L,i);
linkNode q = p->next;
p->next = q->next;
e = q->data;
freeNode(&q);
L->length--;
return;
}
/*遍历链表*/
void listTraverse(linkList *L,void(*visit)(elemType)){
linkNode p = L->head->next;
int j;
while(p != NULL){
visit(p->data);
p = p->next;
}
printf("\n");
return;
}
void visit(elemType e){
printf("%d ",e);
}
int compare(elemType a,elemType b){
return a-b;
}
int main(){
linkList LA;
initList(&LA);
int i=1;
for(i;i<=5;i++){
listInsert(&LA,i,i*3);
}
listTraverse(&LA,visit);
elemType e;
listDelete(&LA,2,e);
listTraverse(&LA,visit);
clearList(&LA);
listTraverse(&LA,visit);
return 0;
}
分享到:
相关推荐
三、多项式运算 多项式是一种数学表达式,它可以表示为a*x^n+a_(n-1)*x^(n-1)+...+a_1*x+a_0。多项式运算是线性表的一个应用场景,通过线性表可以实现多项式的加减乘除等操作。 在本实验中,我们使用带头结点的...
#### 三、总结 通过以上代码分析,我们可以看到使用C语言实现线性表的基本操作非常直观且易于理解。顺序存储方式的优点在于访问效率高,但插入和删除操作可能导致大量元素的移动,效率较低。对于动态变化不频繁的...
线性表`sqlist`结构体包含三个成员:指向整型数组的指针`data`,表示当前线性表的长度`length`,以及表示线性表最大容量的`max`。初始化函数`Initlist`负责分配内存并设置线性表的初始状态,其中`maxsize`定义了...
### 三、总结 本文主要介绍了基于C语言实现的线性表的创建、打印、插入、倒置和删除操作。通过这些操作的学习,可以更好地理解线性表这种数据结构的基本概念和应用方法。在实际开发过程中,线性表是非常常用的数据...
三、实验内容: 实验主要分为以下几个步骤: 1. 定义线性表的顺序存储结构:使用数组作为底层存储,数组的大小通常会预留一定的空间,例如定义了一个名为sqList的数据结构,包含一个存储元素的数组list和表示当前...
三、线性表的操作 1. 插入元素:在线性表的指定位置插入元素,需要考虑数组是否需要扩容,链表则直接创建新节点插入。 2. 删除元素:根据索引删除元素,数组需要移动后续元素,链表只需更改相邻节点的连接。 3. ...
三、链式存储结构 链式存储结构是指用一组结点组成的链表,每个结点包括两个域:数据域和指针域。链表的基本操作包括: * 求长度:返回线性表的长度 * 插入:在线性表第 i(0)个位置插入元素 x * 删除:删除线性表...
#### 三、线性表的基本操作 线性表的基本操作包括初始化、建表、遍历、插入、删除、查找等。 1. **初始化**:为链表分配初始空间,设置头结点。 ```c LinkList InitList(Node*L) { L = (Node*)malloc(sizeof...
程序分为三个主要模块: 1. 主程序模块:负责初始化,接收用户命令,以及显示操作结果。 2. 线性表单元模块:实现ADT Stack中的各种操作。 3. 结点结构单元模块:定义`STU`结构体,即线性表中的元素类型。 在详细...
### 三、总结 通过以上分析可知,该代码实现了线性表中特定位置元素的交换功能,适用于顺序存储的线性表。需要注意的是,在实际应用中,还需要考虑边界条件以及特殊情况处理等问题,例如当m超出线性表范围时应给出...
知识点三:顺序表类的成员函数实现 顺序表类的成员函数实现包括: 1. IsEmpty():判断顺序表是否为空。 2. Length():获取顺序表的长度。 3. Find(int i,T& x):通过下标i获取顺序表中的元素x。 4. Search(T x):...
#### 三、线性表的存储结构 线性表有两种主要的存储方式:顺序存储和链式存储。 - **顺序存储**:将线性表中的元素存储在一组地址连续的存储单元中,通过下标来访问元素。 - **优点**:存取速度快,易于实现。 -...
#### 三、代码解析 根据给定的部分内容,我们可以看到代码实现了一个简单的线性表管理程序。下面是对这些代码的详细解析: 1. **定义结构体**: ```c typedef struct Sqlist{ ElemType* elem; int length; int...
#### 三、代码解析 1. **头文件引入**: ```cpp #include #include using namespace std; ``` 这里引入了`iostream`和`string`两个标准库,分别用于输入输出操作和字符串处理。 2. **常量定义**: ```cpp ...
三、线性表的数据结构 线性表的数据结构可以用抽象数据类型(ADT)来描述: ADT LinearList { 数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0} 结构关系:R={,ai+1>|ai,ai+1 ∈D} 基本操作: InitLinkList...
二、线性表 三、栈与队列 四、数组与字符串 五、树与二叉树 六、图 七、排序算法 八、查找算法 九、哈希表与散列法 十、高级数据结构 一、数据结构概述 重点内容: 数据结构的定义与重要性 数据结构的分类与选择 ...
本实验报告主要针对线性表的顺序存储结构进行讨论,涵盖了线性表的操作实现以及C/C++编程实践。 实验目的主要分为三点: 1. 掌握顺序表存储结构的定义:顺序表是指元素在内存中按照顺序连续存储的数据结构,每个...
在设计过程中,定义了一个名为SqList的结构体,包含三个成员:指向整型数组的指针elem,表示当前长度的整型变量length,以及表示数组当前容量的整型变量listsize。 主要操作包括: 1. `InitList_Sq`:初始化顺序表...
在这个实验报告中,顺序存储结构通过定义一个结构体来表示线性表,包括三个字段:elem表示线性表首元素的地址,length表示线性表的长度,listsize表示线性表的最大容量。顺序存储结构的优点是随机访问速度快,因为...
#### 三、小结 通过以上介绍,我们可以了解到线性表作为一种重要的数据结构,不仅在理论上具有明确的定义和逻辑特征,而且在实践中也有多种不同的存储方式和操作方法。线性表的顺序存储结构因其简单的实现和高效的...