一、诸论
链式存储结构
优点
- 便于数据修改,在对元素进行插入或删除操作的时候仅需修改相应节点的指针域,不必移动指针。
缺点
- 与顺序存储相比,空间利用率低,因为分配给元素的存储单元有一部分被用来存储节点之间的逻辑关系;
- 此外,逻辑相邻的节点不一定存储空间相邻,所以不能对元素进行随机存取。
二、线性表
单链表
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkNode;
双指针法删除单链表中值最大的结点(假设其唯一)
void delmaxnode(LinkNode *&L)
{
LinkNode *p = L -> next,*pre = L,*maxpre = pre;
while(p != NULL)
{
if(maxp -> data < p -> data)
{
maxp = p;
maxpre = pre;
}
pre = p;
p = p -> next;
}
maxpre -> next = maxp -> next;
free(maxp);
}
在非空单链表第一个最大值结点(最大值节点可能有多个)之前插入一个值为x的结点
void delmaxnode(LinkNode *&L,int x)
{
LinkNode *p = L -> next,*pre = L,*maxpre = pre,*s;
while(p != NULL)
{
if(maxp -> data < p -> data)
{
maxp = p;
maxpre = pre;
}
pre = p;
p = p -> next;
}
s = (LinkNode *)malloc(sizeof(LinkNode));
s -> data = x;
s -> next = maxp;
maxpre -> next = s;
}
三、栈和队列
栈
栈的主要特点是后进先出。
问题 :用S表示进栈操作,X表示出栈操作。若进栈顺序为1234,如何得到1342的出栈序列?
答案 :SXSSXSXX
问题 :若进栈顺序为1234,如何得到3142的出栈序列?
答案 :无法得到。
数组模拟栈
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
出栈
bool Pop(SqStack *s,ElemType &e)
{
if(s -> top == -1)
return false;
e = s -> data[s -> top];
s -> top --;
return true;
}
共享栈
使用一个数组实现两个栈,如下图所示,被称为共享栈。
队列
typedef struct
{
ElemType data[MaxSize];
int front,rear; // 头指针和尾指针
}SqQueue;
队空的条件
q -> front == q -> rear;
队满的条件
q -> rear = MaxSize - 1;
初始化队列
void InitQueue(SqQueue *&q)
{
q = (SqQueue *) malloc(sizeof(SqQueue));
q -> front = q -> rear = -1;
}