`
housen1987
  • 浏览: 344933 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论
阅读更多

 

线性表(一) 

 

线性表(二)

线性表的链式表示和实现

线性表的顺序存储可以随机存取表中任一元素,缺点是在做插入或删除操作时,需要移动大量的元素。

线性表的链式存储不要求逻辑上相邻的元素在物理位置上也相邻,在做插入或删除操作时,不需要移动元素,但也失去了随机存取的特点。

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;	
}
 
分享到:
评论

相关推荐

    c程序的线性表程序

    三、多项式运算 多项式是一种数学表达式,它可以表示为a*x^n+a_(n-1)*x^(n-1)+...+a_1*x+a_0。多项式运算是线性表的一个应用场景,通过线性表可以实现多项式的加减乘除等操作。 在本实验中,我们使用带头结点的...

    线性表(c语言代码)

    #### 三、总结 通过以上代码分析,我们可以看到使用C语言实现线性表的基本操作非常直观且易于理解。顺序存储方式的优点在于访问效率高,但插入和删除操作可能导致大量元素的移动,效率较低。对于动态变化不频繁的...

    线性表实现插入删除数据

    线性表`sqlist`结构体包含三个成员:指向整型数组的指针`data`,表示当前线性表的长度`length`,以及表示线性表最大容量的`max`。初始化函数`Initlist`负责分配内存并设置线性表的初始状态,其中`maxsize`定义了...

    线性表的基本操作的实验报告

    三、实验内容: 实验主要分为以下几个步骤: 1. 定义线性表的顺序存储结构:使用数组作为底层存储,数组的大小通常会预留一定的空间,例如定义了一个名为sqList的数据结构,包含一个存储元素的数组list和表示当前...

    线性表 插入倒置删除

    ### 三、总结 本文主要介绍了基于C语言实现的线性表的创建、打印、插入、倒置和删除操作。通过这些操作的学习,可以更好地理解线性表这种数据结构的基本概念和应用方法。在实际开发过程中,线性表是非常常用的数据...

    c语言数据结构实现线性表

    三、线性表的操作 1. 插入元素:在线性表的指定位置插入元素,需要考虑数组是否需要扩容,链表则直接创建新节点插入。 2. 删除元素:根据索引删除元素,数组需要移动后续元素,链表只需更改相邻节点的连接。 3. ...

    数据结构实验一线性表的基本操作.docx

    三、链式存储结构 链式存储结构是指用一组结点组成的链表,每个结点包括两个域:数据域和指针域。链表的基本操作包括: * 求长度:返回线性表的长度 * 插入:在线性表第 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...

    用线性表实现的通讯录,C++代码实现

    #### 三、代码解析 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&gt;|ai,ai+1 ∈D} 基本操作: InitLinkList...

    数据结构入门教程学习攻略 数据结构看这个章节总结就够了

    二、线性表 三、栈与队列 四、数组与字符串 五、树与二叉树 六、图 七、排序算法 八、查找算法 九、哈希表与散列法 十、高级数据结构 一、数据结构概述 重点内容: 数据结构的定义与重要性 数据结构的分类与选择 ...

    数据结构之线性表实验报告

    本实验报告主要针对线性表的顺序存储结构进行讨论,涵盖了线性表的操作实现以及C/C++编程实践。 实验目的主要分为三点: 1. 掌握顺序表存储结构的定义:顺序表是指元素在内存中按照顺序连续存储的数据结构,每个...

    C语言线性表结构实验

    在设计过程中,定义了一个名为SqList的结构体,包含三个成员:指向整型数组的指针elem,表示当前长度的整型变量length,以及表示数组当前容量的整型变量listsize。 主要操作包括: 1. `InitList_Sq`:初始化顺序表...

    关于线性表的顺序存储和链式存储结构的实验报告

    在这个实验报告中,顺序存储结构通过定义一个结构体来表示线性表,包括三个字段:elem表示线性表首元素的地址,length表示线性表的长度,listsize表示线性表的最大容量。顺序存储结构的优点是随机访问速度快,因为...

    数据结构-线性表

    #### 三、小结 通过以上介绍,我们可以了解到线性表作为一种重要的数据结构,不仅在理论上具有明确的定义和逻辑特征,而且在实践中也有多种不同的存储方式和操作方法。线性表的顺序存储结构因其简单的实现和高效的...

Global site tag (gtag.js) - Google Analytics