(1)双链表。下面是C++版本的实现。
#include "stdafx.h"
#include <malloc.h>
//结构体
typedef struct node{
int data; //数据域
struct node *prior,*next; //两个指针域
}Dlink;
//初始化
void DList(Dlink *&dl){ //dl为引用型参数,指针
dl=(Dlink *)malloc(sizeof(Dlink)); //头结点 *dl
dl->prior=dl->next=NULL;
}
//求长度
int Dlength(Dlink *dl){
int i=0;
Dlink *p=dl->next;
while(p!=NULL){
i++;
p=p->next;
}
return i;
}
//查找
Dlink *Dsearch(Dlink *dl,int x){
Dlink *p=dl->next;
while(p!=NULL && p->data!=x)
p=p->next;
return p;
}
//插入
int Dinsert(Dlink *dl,int x,int i){
int j=1;
Dlink *p=dl,*s;
s=(Dlink *)malloc(sizeof(Dlink));
s->data=x;
s->prior=s->next=NULL;
if(i<1 || i>Dlength(dl)+1)
return 0;
while(j<i){
p=p->next;
j++;
}
s->next=p->next; // a)
s->prior=p; // b)
if(p->next!=NULL)
p->next->prior=s; // c)
p->next=s; // d)
return 1;
}
//删除
int Ddelete(Dlink *dl,int i){
int j=1;
Dlink *p=dl,*q;
if(i<1 || i>Dlength(dl))
return 0;
while(j<i){
p=p->next;
j++;
}
q=p->next;
p->next=q->next; // e)
if(q->next!=NULL)
q->next->prior=p; // f)
free(q);
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
其中插入和删除算法可以参照下图
其他的像单链表是双链表的低级版本,只需要在上图中省去一些步骤就行。而循环双链表的结构类似,不在重复。
(2)栈。
这个比较简单,一般用的是数组,也有用单链表的。
(3)队列。下面是环形队列的C++实现
//结构
const int QueueSize=20; //队列的容量
typedef struct sqqueue
{
ElemType data[QueueSize];
int front,rear; //front永远指向空域,即头元素的上一个位置
}SqQueue;
//初始化
void InitQueue(SqQueue &qu)
{
qu.rear=qu.front=0;
}
//入队
int EnQueue(SqQueue &sq,ElemType x)
{
if((sq.rear+1)%QueueSize==sq.front) //队满
return 0;
sq.rear=(sq.rear+1)%QueueSize; //队尾循环进1
sq.data[sq.rear]=x;
return 1;
}
//出队
int DeQueue(SqQueue &sq,ElemType &x)
{
if(sq.rear==sq.front) //队空
return 0;
sq.front=(sq.front+1)%QueueSize; //队头循环进1
x=sq.data[sq.front];
return 1;
}
//取队头元素
int GetHead(SqQueue &sq,ElemType &x)
{
if(sq.rear==sq.front) //队空
return 0;
x=sq.data[(sq.front+1)%QueueSize]; //将队头指针上一个位置的元素值赋给x
return 1;
}
环形队列元素个数用公式(rear+QueueSize-front)%QueueSize求得。
顺序队列一般很少用,因为浪费空间,当然有时候还是可以用的,因为操作简单。
队列还有链式的存储结构。
(4)总结:在用上面结构的时候,最好的方法还是画图。