数据结构:线性表、链、栈、队列
typedef int ElemType;
struct SqList
{
ElemType *elem;
int length;
int listsize;
};
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
typedef struct DuLNode
{
ElemType data;
struct DuNode *prior, *next;
}DuLNode, *DuLinkList;
typedef int SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
}SqStack;
typedef int QElemType;
typedef struct QNode
{
QElemType data;
struct QNode *next;
} *QueuePtr;
struct LinkQueue
{
QueuePtr front, rear;
};
#define MAXQSIZE 100
struct SqQueue
{
QElemType *base;
int front, rear;
};
void Union(SqList &La, SqList Lb)
{
ElemType e, equal;
int La_len, Lb_len;
int i;
La_len = ListLength(La);
Lb_len = ListLength(Lb);
for(i = 1; i <= Lb_len ;i++)
{
GetElem(Lb, i , e);
if(!LocateElem(La , e, equal))
ListInsert(La, ++La_len, e);
}
}
void MergeList_1(SqList La, SqList Lb, SqList &Lc)
{
int i = 1,j = 1,k = 0;
int La_len, Lb_len;
ElemType ai, bj;
InitList(Lc);
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while(i <= La_len && j <= Lb_len)
{
GetElem(La,i,ai);
GetElem(Lb,j,bj);
if(ai <= bj)
{
ListInsert(Lc, ++k, ai);
++i;
}
else
{
ListInsert(Lc, ++k, bj);
++j;
}
}
while(i<=La_len)
{
GetElem(La,i++,ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len)
{
GetElem(Lb,j++,bj);
ListInsert(Lc,++k,bj);
}
}
void MergeList_2(LinkList La, LinkList Lb, LinkList &Lc)
{
LinkList pa = La->next;
LinkList pb = Lb->next;
LinkList pc;
Lc = pc = La;
while(pa && pb)
{
if(pa->data <= pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
free(Lb);
Lb = NULL;
}
void Reverse_1(LinkList L)
{
LNode *p, *q, *r;
p = L;
q = NULL;
while(p)
{
r = p->next;
p->next = q;
q = p;
p = r;
}
L = q;
}
void Reverse_2(LinkList L)
{
LNode *p, *r;
p=L->next;
L-next = NULL;
while(p)
{
r = p->next;
p->next = L->next;
L->next = p;
p = r;
}
}
void Reverse_3(LinkList L)
{
LNode *pre, *p = L->next, *r = p->next;
p->next = NULL;
L-next = NULL;
while(r)
{
pre = p;
p = r;
r = r->next ;
p->next = pre;
}
L->next = p;
return L;
}
LinkList Delete_Min(LinkList &L)
{
LNode *pre = L, *p = pre-next;
LNode *minpre = pre, *minp = p;
while(p)
{
if(p->data < minp->data)
{
minp = p;
minpre = pre;
}
pre = p;
p = p->next;
}
minpre->next = minp->next;
free(minp);
return L;
}
void R_Print(LinkList L)
{
if(L->next)
R_Print(L->next);
print(L->data);
}
Boolean Searcf_k(LinkList L, int k)
{
LinkList *p = L->next, *q = L->next;
int count = 0;
while(p)
{
if(count < k)
{
count++;
p=p->next;
}
else
{
q = q->next;
p = p->next;
}
}
if(count < k)
return false;
else
{
printf("%d", q->data);
return true;
}
}
void Inverser(Stack S, Queue Q)
{
while(!QueueEmpty(Q))
{
DeQueue(Q, x);
Push(S, x);
}
while(!StackEmpty(S))
{
Pop(S,x);
EnQueue(Q, x);
}
}
void SqReverse(SqQueue &Q)
{
int m, r
m = (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;
if(front == rear)
exit;
f = Q.front;
r = (Q.rear - 1 + MAXQSIZE) % MAXQSIZE
for(i = 1; i < m / 2; ++i)
{
Swap(Q.base[f], Q.base[r]);
f = (f + 1) % MAXQSIZE;
r = (Q.rear - 1 + MAXQSIZE) % MAXQSIZE;
}
}
int M_Search(int A[], int B[], int n)
{
int s1 =0, d1 = n-1; m1, s2 = 0, d2 = n-1, m2;
while(s1 != d1 || s2 != d2)
{
m1 = (s1 + d1) / 2;
m2 = (s2 + d2) / 2;
if(A[m1] == B[m2])
return A[m1];
if(A[m1] < B[m1])
{
if((s1+d1) % 2 == 0)
{
s1 = m1;
d2 = m2;
}
else
{
s1 = m1 + 1;
d2 = m2;
}
}
else
{
if((s1 + d1) %2 == 0)
{
d1 = m1;
s2 = m2;
}
else
{
d1 = m1; s2 = m1;
}
}
}
return A[s1] < B[s2] ? A[s1] : B[s2];
}