基础数据结构

(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)总结:在用上面结构的时候,最好的方法还是画图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值