线性表
线性表是n个元素的有限序列。表示方法有两种,一种是顺序表示,一种是链式表示。顺序表示即采用一组地址连续的存储单元依次存储线性表的数据元素,通常采用数组来实现;链式表示是用一组任意的存储单元存储线性表的数据元素,每一结点包含两个域:数据域和指针域,数据域存储数据,指针域存储后继存储地址信息,实现为:
int main()
{
typedef struct lnode
{
int data;
struct lnode *next;
}lnode;
lnode lnode1,lnode2;
lnode1.data=5;
lnode1.next=&lnode2;
lnode2.data = 8;
lnode2.next =NULL;
lnode *p=&lnode1;
cout<<p->data<<endl;//p->data等同于(*p).data
p=p->next ;
cout<<p->data <<endl;
cout<<p->next <<endl;
return 0;
}
输出结果为5,8,0
循环链表是另一种形式的链式存储结构,它的特点是表中最后一个元素的指针域指向头结点,整个链表形成一个环。
双向链表的每个结点有两个指针域,一个指向后继结点,一个指向前结点,实现为:
typedef struct dullnode
{
int data;
struct dullnode *prior;
struct dullnode *next;
}lnode;
栈
栈是限定仅在表尾进行插入或删除操作的线性表,表尾称为栈顶,表头称为栈底。实现方式也有两种,这里只说顺序栈。顺序栈,即栈的数据存储是利用一组地址连续的存储单元实现的。实现:
#include<iostream>
using namespace std;
typedef struct stack
{
int stacksize;
int *base;
int *top;
}stack;
void initstack(stack &stack1);
void pushstack(stack &stack1,int a);
int main()
{
stack stack1;
stack1.stacksize =50;
initstack(stack1);
pushstack(stack1,9);
pushstack(stack1,10);
return 0;
}
void initstack(stack &stack1)
{
stack1.base =(int *)malloc(sizeof(int)*stack1.stacksize );
if(NULL==stack1.base )
{
exit(OVERFLOW);
}
stack1.top =stack1.base ;
}
void pushstack(stack &stack1,int a)
{
if((stack1.top -stack1.base )>=(sizeof(int)*stack1.stacksize))
{
/*如果栈已满,则追加存储空间*/
stack1.base =(int *)realloc(stack1.base ,sizeof(int)*stack1.stacksize*2);
stack1.stacksize =stack1.stacksize*2;
}
*stack1.top=a;
stack1.top++;
}
队列
队列是一种先进先出(FIFO)的线性表,只允许在表的一端进行插入,另一端进行删除元素。允许插入的一端叫做队尾,允许删除的一端称为对头。队列也有两种存储方式,分别为顺序存储和链表存储。如果结点使用链表存储,这队列称为链队列。实现为:
typedef struct qnode
{
int data;
struct qnode *next;
}qnode,*qnodeptr;
typedef struct
{
qnodeptr front;
qnodeptr rear;
}linkqueue;