链表:只能通过遍历访问

//链表的存储结构
typedef struct
{
  ElemType data; //data表示结点的数据域
  struct LNode* next; //next表示结点的指针域
}LNode,*LinkList; 

链表一般都增设有头结点,这是为了在删除首元结点或者插入新元素使之成为首元结点时,其操作与在其它位置时一样。例如,无头结点的链表其删除首元结点的操作如下:

//p指向待删除结点,L是链表的表指针
if(p==L)
{
	L=p->next;
}
else
{
//q指向p的前驱结点
	q=p->next;
}
free(p);

如果增加头结点,那么对所有的结点进行增加和删除都是一样的操作。

链栈:头插头删

//链栈的存储结构
typedef struct
{
  ElemType data; //data表示结点的数据域
  struct StackNode* next; //next表示结点的指针域
}StackNode,*LinkStack; 

链栈其实就是功能受限的链表,即只能头插头删元素,故而链栈与链表的存储结构一样。而且由于插入和删除操作都是在首元结点(不像普通链表一样可能在其它位置),故而无需增加头结点。

链队:头删尾插

//链队的存储结构
typedef struct
{
  ElemType data; //data表示结点的数据域
  struct QueueNode* next; //next表示结点的指针域
}QueueNode,*QueuePtr; 
typedef struct
{
	QueuePtr front; //front是队首指针,但为了方便删除队首元素,故指向头结点
    QueuePtr rear; //rear是队尾指针,指向队尾元素
}LinkQueue;

链队其实也是功能受限的链表,相较于链表来说,为了方便找到队尾元素,故而链队需要增设一个尾指针rear。为了方便找到队首指针front和队尾指针,将它们封装在一个结构体内。而front其实也就是链表的表指针。