C语言线性链表

线性表的链式存储结构的特点

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

因此为了表示每个数据元素与其直接后继数据元素之间的逻辑关系之外,对一个数据元素来说,除了存储本身的信息之外还需存储一个指示其后继的信息。

结点则是这两部分信息组成数据元素的存储映像。一个节点包含了两个域,分别为数据域指针域
数据域是存储数据元素信息的域。
指针域则是存储直接后继存储位置的域。
指针域中存储的信息称作指针和链。n个结点链构成一个链表,即为线性表的链式存储结构。如果一个链表中的一个结点只包含一个指针域,故又称其为线性链表或单链表。

头指针

整个链表的存取应从头指针开始进行,头指针指示链表中的第一个结点的存储位置。指针为数据元素之间的逻辑关系的映像,则逻辑上相邻的两个数据元素其存储的物理位置不要求紧邻,由此,这种存储结构为非顺序映像或链式映像。

单链表可由头指针惟一确定,在C语言中可用结构指针来描述。

// 线性表的单链表存储结构
typedef struct LNode 
{
    
    
	ElemType data;
	struct LNode *next;
}LNode,* Linklist;

假设La是Linklist型的变量,则La为单链表的头指针,它指向表中第一个结点。若La为“空”, 即(La = NULL),则所表示的线性表为空表,长度n为“零”。有时候我们可以在单链表的第一个结点之前附设一个结点,称之为头结点。头结点的数据域可以不存储任何信息,也可存储如线性表的长度等类的附加信息,头结点的指针域存储指向第一个结点的指针。

在线性表的顺序存储结构中,由于逻辑上相邻的两个元素在物理位置上紧邻,则每个元素的存储位置都可从线性表的起始位置计算得到。而在单链表中,任何两个元素的存储位置之间没有固定的联系。然而每个元素的存储位置都包含在其直接前驱结点的信息之中。假使p是指向线性表中第 i 个数据元素的指针,则p->next是指向第 i+1 个数据元素的指针。换句话说,若 p->data = a(数据元素) ,则p->next->data = ai(下一个数据元素) . 则在单链表中,取得第 i 个数据元素必须从头指针出发寻找,因此,单链表表示的是非随机存取的存储结构。
下面实现一个函数GetElem

#define OK 1
#define ERROR -1
typedef int ElemType
typedef int Status
Status GetElemL(Linklist L,int i,ElemType &e)
{
    
    	//L为带头结点的单链表的头指针
	//当第 i 个元素存在时,其值赋给e并返回OK,否则返回ERROR
	p = L->next; j = 1 ;
	while (p && j<i){
    
    
	     p = p ->next; ++j;
	}
	if(!p||j > i) return ERROR;
	e = p->data;
	return OK;
} //GetElemL

Guess you like

Origin blog.csdn.net/qq_32100603/article/details/109481974