一、绪论
1.数组中按值查找元素
int Search(int a[],int n,int k){for(int i=1;i<=n;i++){if(a[i]==k){return i;}}return 0;
}
2.找最大值和次大值
void FindMax(int a[],int n,int *pmax1,int *pmax2){if(a[1]>a[2]){*pmax1=a[1];*pmax2=a[2];}else{*pmax1=a[2];*pmax2=a[1];}for(int i=3;i<=n;i++){if(a[i]>*pmax1){*pmax2=*pmax1;*pmax1=a[i];}else if(a[i]>*pmax2){*pmax2=a[i];}}
}
二、线性表
1.顺序表的逆置
void reverse(SeqList *q){int temp,i;for(i=0;i<q->length/2;i++){temp=q->elem[i];q->elem[i]=q->elem[q->length-i-1];q->elem[q->length-i-1]=temp;}
}
2.单链表的逆置
void reverse(SeqList *q){int temp,i;for(i=0;i<q->length/2;i++){temp=q->elem[i];q->elem[i]=q->elem[q->length-i-1];q->elem[q->length-i-1]=temp;}
}
3.找出顺序表中的最小值
int FindMin(SeqList *q ) {int i=0;int min = q->elem[i];for (i = 1; i < q->length; i++) {if (q->elem[i] < min) {min = q->elem[i];}}for(i=0;i<q->length;i++){if(min==q->elem[i])break;}return i;
}
4.删除顺序表中的指定值元素
void DeleteX(SeqList *q,ElemType x){int flag=0;for(int i=0;i<q->length;i++){if(q->elem[i]!=x){q->elem[flag]=q->elem[i];flag++;} }q->length=flag;
}
5.删除循环链表中已知结点的前驱
void DelPrior(LNode *s){int a;LNode *p,*q;p=q=s;while(q->next!=s){q=q->next;}while(p->next!=q)p=p->next;a=q->data;p->next=s;free(q);
}
6.从单链表LA指定位置删除连续n个元素并插入单链表LB的指定位置
void MoveLaToLb(LinkList *pa,int i,int len,LinkList *pb,int j) {
LinkList m, n, p, q, r;int length = 1;m = *pa;while (m) {length++;m = m->next;}if (i + len > length)return;q = *pb;length = 0;while (q) {length++;q = q->next;}if (j > length)return;m = *pa;if (i == 1) {n = m;for (int k=0;k<len-1;k++) {m = m->next;}p = m;*pa = m->next;}else {for (int k=0;k<i-2;k++) {m = m->next;}r = m;n = m->next;for (int k=0;k<len;k++) {m = m->next;}p = m;r->next = p->next;}q = *pb;if (!j) {p->next = q;*pb = n;}else {for (int k=0;k<j-1;k++) {q = q->next;}p->next = q->next;q->next = n;}
}
7.两个单链表元素的交叉合并
LinkList CombineList(LinkList La,LinkList Lb)
{LNode *p,*q,*r;LinkList Lc;int m=0,n=0;p = La->next;q = Lb->next;while(p){++m;p = p->next;}while(q){++n;q = q->next;}p = La->next;q = Lb->next;if(m <= n){Lc = La;r = Lc; while(p && q){r->next = p;r = p; p = p->next;r->next = q;r = q;q = q->next;}while(q){r->next = q;r = q;q = q->next;}free(Lb); }else{Lc = Lb;r = Lc;while(p && q){r->next = q;r = q;q = q->next;r->next = p;r = p;p = p->next;}while(p){r->next = p;r = p;p = p->next;}free(La);}return (Lc);
}
三、栈和队列
1.使用栈进行回文判断
int IsPalindrome(char s[]){int len = strlen(s);SeqStack *stack = InitStack();int mid = len/2;for(int i=0;i<mid;i++){Push(stack,s[i]);}if(len%2!=0)mid++;for(int i=mid;i<len;i++){char flag;if(Pop(stack,&flag)==FALSE)return 0;if(flag!=s[i])return 0;}return 1;
}
2.判断表达式中括号是否匹配
int IsBracketMatch(char *str){SeqStack *stack = InitStack();char flagChar,leftChar;for(int i=0;(flagChar=str[i])!='\0';i++){if(flagChar=='['||flagChar=='{'||flagChar=='('){Push(stack,flagChar);}else if(flagChar==']'||flagChar=='}'||flagChar==')'){if(IsEmpty(stack))return 0;Pop(stack,&leftChar); if((flagChar==']'&&leftChar!='[')||(flagChar=='}'&&leftChar!='{')||(flagChar==')'&&leftChar!='('))return 0;}} return IsEmpty(stack)?1:0;
}
3.队列的操作集合(带尾指针的循环链表)
CirLinkQueue InitQueue() {LNode *head = (LNode *)malloc(sizeof(LNode));head->next = head;return head;
}
int IsEmptyQueue(CirLinkQueue Q) {return (Q->next->next == Q->next) ? 1 : 0;
}
int EnQueue(CirLinkQueue *Q, DataType x) {LNode *newNode = (LNode *)malloc(sizeof(LNode));newNode->data = x;newNode->next = (*Q)->next;(*Q)->next = newNode;*Q = newNode;return 1;
}
int DelQueue(CirLinkQueue *Q, DataType *x) {if (IsEmptyQueue(*Q)) {return 0;}LNode *head = (*Q)->next;LNode *front = head->next;*x = front->data;head->next = front->next;if (front == *Q) {*Q = head;}free(front);return 1;
}
4.循环链表的操作集合(只设rear和quelen)
int IsEmptyQueue(SeQueue *Q){if(Q->quelen==0) return 1;return 0;
}
int IsFullQueue(SeQueue *Q){if(Q->quelen==MAXSIZE) return 1;return 0;
}
int EnQueue(SeQueue *Q,ElemType x){if(IsFullQueue(Q)) return 0;Q->rear=(Q->rear+1)%MAXSIZE;Q->elem[Q->rear]=x;Q->quelen++;return 1;
}int DelQueue(SeQueue *Q,ElemType *x){if(IsEmptyQueue(Q)) return 0;int front=(Q->rear-Q->quelen+1+MAXSIZE)%MAXSIZE;*x=Q->elem[front];Q->quelen--;return 1;
}
5.循环队列的操作集合(增设tag)
SeqQueue * InitQueue(){SeqQueue *Q=(SeqQueue *)malloc(sizeof(SeqQueue));Q->rear=0,Q->front=0,Q->tag=0;return Q;
}
int IsEmptyQueue(SeqQueue *Q){if((Q->rear==Q->front)&&Q->tag==0) return 1;return 0;
}
int IsFullQueue(SeqQueue *Q){if((Q->rear==Q->front)&&Q->tag==1) return 1;return 0;
}
int EnQueue(SeqQueue *Q,ElemType x){if(IsFullQueue(Q)) return 0;Q->rear=(Q->rear+1)%MAXSIZE;Q->elem[Q->rear]=x;Q->tag=1;return 1;
}
int DelQueue(SeqQueue *Q,ElemType *x){if(IsEmptyQueue(Q)) return 0;Q->front=(Q->front+1)%MAXSIZE;*x=Q->elem[Q->front];Q->tag=0;return 1;
}
六、树
1.二叉树中求度为2的结点的个数
int Degree2(BiTree bt){if(bt==NULL) return 0;int sum=0;if(bt->Lchild!=NULL&&bt->Rchild!=NULL) sum++;return sum+Degree2(bt->Lchild)+Degree2(bt->Rchild);
}
2.交换二叉树的左右子树
void SwapLR(BiTree bt){BiTree t;if(bt==NULL) return ;t=bt->Lchild;bt->Lchild=bt->Rchild;bt->Rchild=t;SwapLR(bt->Lchild);SwapLR(bt->Rchild);
}
3.二叉树的先序输出各结点及其层次
void PreOrderLayer (BiTree bt, int lay){if(bt==NULL) return ;printf("(%c,%d)",bt->data,lay);PreOrderLayer(bt->Lchild,lay+1);PreOrderLayer(bt->Rchild,lay+1);
}
4.求树(或森林)的叶子结点数
int NumOfLeaf(CSTree rt){if(rt==NULL) return 0;int count=0;if(rt->FirstChild==NULL) count++;return count+NumOfLeaf(rt->FirstChild)+NumOfLeaf(rt->NextSibling);
}
5. 求树(或森林)的高度
int GetHeight (CSTree rt){if(rt==NULL) return 0;int child_h=1+GetHeight(rt->FirstChild);int next_h=GetHeight(rt->NextSibling);return child_h>next_h?child_h:next_h;
}