数据结构考研代码
第一章:线性表
1.一维数组静态分配
#define MaxSize 50
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
2.一维数组动态分配
#define InitSize 100
typedef struct {
ElemType *data;
int length,
MaxSize;
}SqList;
L.data = (ElemType *)malloc(InitSize *sizeof(ElemType));
3.元素e插入到顺序表L中位序i的位置
bool ListInsert(SqList &L. int i, ElemType e){
if(i<1 || i>L.length+1)
return false;
if(L.length >= MaxSize)
return false;
for(int j=L.length;j>=i;j--)
L.data[j] = L.data[j-1];
L.data[i-1] = e;
L.length++;
return true;
}
4.删除顺序表L中第i个位置的元素
bool listDelete(SqList &L; int i; ElemType &e){
if(i<1 || i>L.length){
return false;
}
e = L.data[i-1];
for(int j=i; j<L.length; ++j){
L.data[j-1] = L.data[j];
}
L.length--;
return true;
}
5.查找顺序表中值为e的元素,如果查找成功,返回元素位序,否则返回0
int LocateElem(SqList L, ElemType e){
int i;
for(i=0; i<L.length; ++i){
if(L.data[i] == e){
return i+1;
}
}
return 0;
}
6.单链表结点类型描述
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
7.头插法建立单链表
LinkList creatListByHead(LinkList &L){
LNode *s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
scanf("%d",&x);
while(x != 9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
8.尾插法建立单链表
LinkList creatListByTail(LinkList &L){
int x;
L = (LinkList)malloc(sizeof(LNode));
LNode *s,
*r = L;
scanf("%d",&x);
while(x != 9999){
s = (LinkList)malloc(sizeof(LNode));
s->data = x;
r->next = s;
r = s;
scanf("%d",&x);
}
r->next = NULL;
return L;
}
9.取出单链表L(带头节点)中第i个位置的结点指针(在单链表中按照序号查找结点值)
LNode *getElemByPos(LinkList L, int i){
int j = 1;
LNode *p = L->next;
if(i == 0){
return L;
}
if(i < 1)
return NULL;
while(p!=NULL
&& j<i){
p = p->next;
j++;
}
return p;
}
10.在单链表中按值查找结点
LNode *locateElemByValue(LinkList L, ElemType e){
LNode *p = L->next;
while(p!=NULL && p->data!=e){
p = p->next;
}
return p;
}
11.将值为x的节点插入到单链表的第i个位置上
void insertNode(LinkList L, int i; ElemType x){
if(i<1 || i>length(L)+1){
return;
}
LNode *s = (LinkList)malloc(sizeof(LNode));
s->data = x;
LNode p = getElem(L,i-1);
s->next = p->next;
p->next = s;
}
12.将单链表上的第i个节点删除
bool deleteNode(LinkList L; int i; ElemType &e){
if(i<1 || i>length(L)){
return false;
}
LNode *p,
*q;
p = getElem(L,i-1);
q = p->next;
p->next = p->next;
e = q->data;
free(q);
return true;
}
13.双链表的结点类型描述
typedef struct DNode{
ElemType data;
struct DNode *prior,
*next;
}DNode,*DLinkList;
14.双链表在p之后插入s
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
15.双链表的删除:删除p的后继结点q
p->next = q->next;
q->next->prior = p;
free(q);
16.静态链表结构类型描述
#define MaxSize 50
typedef struct{
ElemType data;
int next;
}SLinkList[MaxSize];
第二章:栈和队列
1.栈的顺序存储类型描述
#define MaxSize 50
typedef struct{
ElemType data[MaxSize];
int top;
}SqStack;
2.顺序栈:初始化栈
void InitStack(SqStack &S){
S.top = -1;
}
3.顺序栈:判断栈空
bool StackEmpty(SqStack S){
if(S.top == -1){
return true;
}else{
return false;
}
}
4.顺序栈:进栈
bool Push(SqStack &S, ElemType x){
if(S.top == MaxSize-1){
return false;
}
S.data[++S.top] = x;
return true;
}
5.顺序栈:出栈
bool Pop(SqStack &S, ElemType &x){
if(S.top == -1){
return false;
}
x = S.data[S.top--];
return true;
}
6.顺序栈:读取栈顶元素
bool GetTop(SqStack &S, ElemType &x){
if(S.top == -1){
return false;
}
x = S.data[S.top];
return true;
}
7.栈的链式存储类型描述
typedef struct LNode{
ElemType data;
struct LNode *next;
}
8.链栈:初始化
void initStack(LNode *&lst){
lst = (LNode* )malloc(sizeof(LNode));
lst->next = NULL;
}
9.链栈:判断栈空
bool isEmpty(LNode *lst){
if(lst->next == NULL){
return true;
}else{
return false;
}
}
10.链栈:使用头插法将新的结点插入到头结点后
void push(LNode *lst, ElemType x){
LNode *p;
p = (LNode *)malloc(sizeof(LNode));
p->data = x;
p->next = lst->next
lst->next = p;
}
11.链栈:出栈
bool pop(LNode *lst, ElemType &x){
if(lst->next == NULL)
return false;
LNode *p ;
p = lst->next;
x = p->data;
lst->next = p->next;
free(p);
return true;
}
12.队列的顺序存储类型描述
typedef struct{
ElemType data[MaxSize];
int front,
rear;
}SqQueue;
13.循环队列:初始化
void InitQueue(SqQueue &Q){
Q.rear = Q.front = 0;
}
14.循环队列:判断队列是否为空
bool isEmpty(SqQueue Q){
return Q.rear = Q.front;
}
15.循环队列:入队
bool EnQueue(SqQueue &Q, ElemType x){
if((Q.rear+1) % MaxSize == Q.front){
return false;
}
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
16.循环队列:出队
bool DeQueue(SqQueue &Q, ElemType &X){
if(Q.rear == Q.front){
return false;
}
X = Q.data[Q.front];
Q.front = (Q.front+1) % MaxSize;
return true;
}
17.队列的链式存储类型描述
typedef struct LinkNode{
ElemType data;
struct LinkNode * next;
}LinkNode;
typedef struct LinkNode{
LinkNode *front,
*rear;
}LinkQueue;
18.链式队列【有头结点】:初始化
void InitQueue(LinkQueue &Q){
Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
19.链式队列【有头结点】:判断队空
bool isEmpty(LinkQueue Q){
if(Q.front = Q.rear){
return true;
}else{
return false;
}
}
20.链式队列【有头结点】:入队
void EnQueue(LinkQueue &Q, ElemType X){
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q