注:请注意对应题号,以下内容仅为个人代码,不代表最终答案,仅供参考。
目录
DC02PE11 构建初始容量和扩容增量分别为size和inc的空顺序栈S
DC02PE32 利用循环队列编写求k阶斐波那契序列中第n+1项fn的算法
DC02PE86将带头结点单链表的第i元素起的所有元素移除,并构成一个带头结点的新链表
DC02PE88试写一算法,在带头结点单链表删除第i元素起的所有元素
DC02PE98判断一条类似链表的结构是否为合法的双向循环链表
DC02PE03 实现顺序栈判空操作
Status StackEmpty_Sq(SqStack S) {
// Add your code here
return !S.top;
}
DC02PE05 实现顺序栈取栈顶元素操作
Status GetTop_Sq(SqStack S, ElemType &e)
{// Add your code here
if(!S.top) return ERROR;
e = S.elem[S.top-1];
return OK;
}
DC02PE07 实现顺序栈出栈操作
Status Pop_Sq(SqStack &S, ElemType &e) {
// Add your code here
if(S.top<=0) return ERROR;
e = S.elem[--S.top];
}
DC02PE11 构建初始容量和扩容增量分别为size和inc的空顺序栈S
Status InitStack_Sq2(SqStack2 &S, int size, int inc) {
// Add your code here
if(size<=0 or inc<=0) return ERROR;
S.elem = (ElemType *)malloc(size*sizeof(ElemType));
S.top = S.elem;
S.size = size;
S.increment = inc;
}
DC02PE13 实现顺序栈的判空操作
Status StackEmpty_Sq2(SqStack2 S) {
// Add your code here
return S.top<=S.elem;
}
DC02PE15 实现顺序栈入栈操作
Status Push_Sq2(SqStack2 &S, ElemType e) {
// Add your code here
ElemType *p;
if(S.top>=S.elem+S.size){
p=(ElemType *)realloc(S.elem,(S.size+S.increment)*sizeof(ElemType));
if(!p) return ERROR;
S.elem = p;
S.top = S.elem+S.size;
S.size+=S.increment;
}
*S.top++=e;
return OK;
}
DC02PE17 实现顺序栈出栈操作
Status Pop_Sq2(SqStack2 &S, ElemType &e) {
// Add your code here
if(S.top <= S.elem) return ERROR;
e=*(--S.top);
return OK;
}
DC02PE19 借助辅助栈,复制顺序栈S1得到S2
Status CopyStack_Sq(SqStack S1, SqStack &S2) {
// Add your code here
S2.elem = S1.elem;
S2.top = S1.top;
S2.size = S1.size;
S2.increment = S1.increment;
return 1;
}
DC02PE20 数制转换:将十进制数转换为指定进制的数
void Conversion(int N, int rd)
{ // Add your code here
string s="";
while(N){
s=char(N%rd+'0')+s;
N/=rd;
}
for(int i=0;i<s.size();i++) printf("%c",s[i]);
}
DC02PE21 判断一个括号串中的括号是否匹配
Status matchBracketSequence(char* exp, int n)
{ // Add your code here
int j,k,l;
j=k=l=0;
for(int i=0;i<n;i++){
if(exp[i] == '{') j++;
else if(exp[i] == '[') k++;
else if(exp[i] == '(') l++;
else if(exp[i] == '}') {
j--;
if(j<0) return 0;
}
else if(exp[i] == ']') {
k--;
if(k<0) return 0;
}
else {
l--;
if(l<0) return 0;
}
}
return (j==0 and k==0) and l==0;
}
DC02PE23 求循环队列的长度
int QueueLength_Sq(SqQueue Q) {
// Add your code here
return (Q.rear-Q.front+Q.maxSize)%Q.maxSize;
}
DC02PE25 编写入队列和出队列的算法
Status EnCQueue(CTagQueue &Q, ElemType x) {
// Add your code here
if(Q.tag==1) return ERROR;
Q.elem[Q.rear++] = x;
if(Q.front == Q.rear) Q.tag = 1;
return OK;
}
Status DeCQueue(CTagQueue &Q, ElemType &x){
// Add your code here
if(Q.tag==0 and Q.front==Q.rear) return ERROR;
x = Q.elem[Q.front++];
if(Q.front == Q.rear) Q.tag = 0;
return OK;
}
DC02PE27 写出循环队列的入队列和出队列的算法
Status EnCQueue(CLenQueue &Q, ElemType x) {
// Add your code here
if(Q.length>=MAXQSIZE) return 0;
Q.length++;
Q.elem[++Q.rear] = x;
return OK;
}
Status DeCQueue(CLenQueue &Q, ElemType &x){
// Add your code here
if(Q.length==0) return ERROR;
Q.rear++;
Q.rear--; Q.length--;
return OK;
}
DC02PE32 利用循环队列编写求k阶斐波那契序列中第n+1项fn的算法
#include <iostream>
const int N=1e5;
long Fib(int k, int n) {
// Add your code here
if(n==k-1 or n==k) return 1;
if(n<k) return 0;
int a[N];
memset(a,0,sizeof(a));
a[0]=a[1]=1;
int t=n-k,m=2;
while(t--){
long long sum=0;
for(int i=(m-k>=0?m-k:0);i<m;i++) sum+=a[i];
a[m]=sum;
m++;
}
return a[m-1];
}
DC02PE33 比较两个有序顺序表的大小
#include <math.h>
char Compare(SqList A, SqList B)
{ // Add your code here
if(A.length==0 and B.length==0) return '=';
else if(A.length==0) return '<';
else if(B.length==0) return '>';
int minn = min(A.length,B.length);
for(int i=0;i<minn;i++){
if(A.elem[i]>B.elem[i]) return '>';
else if(A.elem[i]<B.elem[i]) return '<';
}
if(A.length>B.length) return '>';
else if(A.length<B.length) return '<';
else return '=';
}
DC02PE35 试写一算法,实现顺序表的就地逆置
void Inverse(SqList &L)
{ // Add your code here
for(int i=0;i<L.length/2;i++){
ElemType *e = (ElemType *)malloc(sizeof(ElemType));
*e = L.elem[i];
L.elem[i] = L.elem[L.length-1-i];
L.elem[L.length-1-i] = *e;
}
}
DC02PE45 试写一算法,求并集A=A∪B。
void Union(SqList &La, List Lb)
{ // Add your code here
for(int i=0;i<Lb.length;i++)
if(Search_Sq(La,Lb.elem[i])==-1) La.elem[La.length++]=Lb.elem[i];
}
DC02PE53 试写一算法,实现链栈的判空操作
Status StackEmpty_L(LStack S)
{ // Add your code here
return S==NULL;
}
DC02PE55 试写一算法,实现链栈的取栈顶元素操作
Status GetTop_L(LStack S, ElemType &e)
{ // Add your code here
if(S==NULL) return ERROR;
e = S->data;
return OK;
}
DC02PE61 实现链队列的判空操作
Status QueueEmpty_LQ(LQueue Q)
{ // Add your code here
return Q.front==NULL;
}
DC02PE63 实现链队列的求队列长度操作
int QueueLength_LQ(LQueue Q)
{ // Add your code here
if(Q.front == NULL) return 0;
int res=1;
while(Q.front!=Q.rear){
res++;
Q.front=Q.front->next;
}
return res;
}
DC02PE68编写队列初始化、入队列和出队列的算法
Status InitCLQueue(CLQueue &rear)
{ // Add your code here
rear=(CLQueue)malloc(sizeof(CLQueue));
rear->data = NULL;
rear->next = rear;
return OK;
}
Status EnCLQueue(CLQueue &rear, ElemType x)
{ // Add your code here
if(rear==NULL){
InitCLQueue(rear);
rear->data = x;
return OK;
}
CLQNode *node = (CLQNode *)malloc(sizeof(CLQNode));
node->data = x;
node->next = rear->next;
rear->next = node;
rear=rear->next;
return OK;
}
Status DeCLQueue(CLQueue &rear, ElemType &x)
{ // Add your code here
if(rear->data==NULL) return ERROR;
CLQNode *p = (CLQNode *)malloc(sizeof(CLQNode));
p = rear->next->next;
rear->next = p;
return OK;
}
DC02PE71实现带头结点单链表的判空操作。
Status ListEmpty_L(LinkList L)
{ // Add your code here
return L->data==NULL and L->next==NULL;
}
DC02PE73实现带头结点单链表的销毁操作
Status DestroyList_L(LinkList &L)
{ // Add your code here
L=NULL;
return OK;
}
DC02PE75实现带头结点单链表的清空操作
Status ClearList_L(LinkList &L)
{ // Add your code here
if(L==NULL) return ERROR;
while(L->next != NULL){
L->data = NULL;
L = L->next;
}
return OK;
}
DC02PE77实现带头结点单链表的求表长度操作
int ListLength_L(LinkList L)
{ // Add your code here
if(L==NULL) return -1;
int res = 0;
while(L->next){
res++;
L=L->next;
}
return res;
}
DC02PE82在带头结点单链表L的第i个位置插入e
Status Insert_L(LinkList L, int i, ElemType e)
{ // Add your code here
if(i<=0 or L==NULL) return ERROR;
LNode *p = L;
int pos = 1;
while(pos<i and p->next){
pos++;
p=p->next;
}
if(pos!=i) return ERROR;
LNode *node = (LNode *)malloc(sizeof(LNode));
node->data = e;
node->next = p->next;
p->next = node;
return OK;
}
DC02PE84在带头结点单链表删除第i元素到e
Status Delete_L(LinkList L, int i, ElemType &e)
{ // Add your code here
if(L==NULL or i<=0) return ERROR;
int pos = 0;
LNode *pre = (LNode*)malloc(sizeof(LNode));
LNode *las = L;
while(pos<i and las->next){
pos++;
pre = las;
las=las->next;
}
if(pos!=i) return ERROR;
e=las->data;
pre->next = las->next;
return OK;
}
DC02PE86将带头结点单链表的第i元素起的所有元素移除,并构成一个带头结点的新链表
Status Split_L(LinkList L, LinkList &Li, int i)
{ // Add your code here
if(L==NULL or i<=0){
Li=NULL;
return ERROR;
}
int pos = 0;
LinkList p = L;
while(pos<i-1 and p->next){
pos++;
p=p->next;
}
if(pos < i-1 or p->next==NULL){
Li = NULL;
return ERROR;
}
Li = (LinkList)malloc(sizeof(LinkList));
Li->next = p->next;
p->next = NULL;
return OK;
}
DC02PE88试写一算法,在带头结点单链表删除第i元素起的所有元素
Status Cut_L(LinkList L, int i)
{ // Add your code here
if(i<=0 or L->next == NULL) return ERROR;
if(i==1){
L->next = NULL;
L=L->next;
return OK;
}
int pos = 0;
i--;
LinkList p = L;
while(pos<i and p->next!=NULL){
pos++;
p=p->next;
}
if(pos!=i or p->next == NULL) return ERROR;
p->next=NULL;
return OK;
}
DC02PE90删除带头结点单链表中所有值为x的元素
Status DeleteX_L(LinkList L, ElemType x)
{ // Add your code here
if(L->next == NULL) return ERROR;
LinkList p = L;
int num=0;
while(p->next != NULL){
LinkList node = p->next;
if(node->data == x) {
num++;
if(node->next) p->next = node->next;
else p->next = NULL;
free(node);
}
else p=p->next;
}
return num;
}
DC02PE91删除带头结点单链表中所有值小于x的元素
Status DeleteSome_L(LinkList L, ElemType x)
{ // Add your code here
if(L->next == NULL) return ERROR;
LinkList p = L;
int num=0;
while(p->next != NULL){
LinkList node = p->next;
if(node->data < x) {
num++;
if(node->next) p->next = node->next;
else p->next = NULL;
free(node);
}
else p=p->next;
}
return num;
}
DC02PE93删除双向链表中的重复结点
#include <map>
DuLinkList delDuplicateDuLNodes(DuLinkList L)
{ // Add your code here
if(L == NULL) return L;
map<char,int>mp;
DuLinkList p = L;
mp[p->data] = 1;
while(p->next){
DuLNode *node = p->next;
if(!mp[node->data]) {
mp[node->data] = 1;
p=p->next;
}
else {
if(node->next == NULL) {
p->next = NULL;
break;
}
else {
DuLNode *no = node->next;
p->next = no;
no->prior = p;
}
}
}
return L;
}
DC02PE94将一条双向链表逆置
void reverseDuLinkList(DuLinkList L)
{ // Add your code here
if(!L) return;
auto node = L->next;
while(node){
auto t = node->next;
node->next = node->prior;
if(t) {
node->prior = t;
node = t;
}
else {
L->next->next = NULL;
node->prior = L;
L->next = node;
return;
}
}
}
DC02PE95将一条双向循环链表逆置
void reverseDuCirLinkList(DuCirLinkList L)
{ // Add your code here
if(!L or L->next == L->prior) return;
DuLNode *p,*q;
p=L;
do{
q=p->next;
p->next=p->prior;
p->prior=q;
p=q;
}while(p!=L);
}
DC02PE97双向交错遍历一条双向循环链表
void InterleavedTravelDuCirLinkList(DuCirLinkList L, DuLNode* p)
{ // Add your code here
if (!p) return;
auto las = p->next, pre = p->prior;
while (las or pre) {
if (las == pre) {
if (las != L) printf("%c", las->data);
break;
}
if (las == L) las = las->next;
if (pre == L) pre = pre->prior;
if (las == pre) {
if (las != L) printf("%c", las->data);
break;
}
if (las) {
printf("%c", las->data);
las = las->next;
}
if (pre) {
printf("%c", pre->data);
pre = pre->prior;
}
if (las->prior == pre) break;
}
if (p != L) printf("%c", p->data);
}
DC02PE98判断一条类似链表的结构是否为合法的双向循环链表
Status isLeagalDuCirLinkList(DuCirLinkList L)
{ // Add your code here
if(L==NULL) return 1;
auto node = L->next, pre = L;
do{
if((!node or !pre) or !node->next) return 0;
if(node->prior != pre or pre->next!=node) return 0;
pre = node;
node = node->next;
}while(pre!=L);
return 1;
}