/**************************************
整数对应 32 bit 二进制数串中数字1的个数
2016-10-24
liukun
***************************************/
#include <stdio.h>
// #include <math.h> // 整数对应 32 bit 二进制数串中数字1的个数
int binary1counter(int n)
{
// if(n<0) return -1;
int i;
// int binaLength = ceil(log2(n));
int counter1=0;
for(i=0;i<32;++i) //for(i=0;i<binaLength;++i)
{
if(n & 1!=0)counter1++;
n = n>>1;
}
printf("%d\n",counter1);
return 1;
} int main()
{
binary1counter(-21);
return 0;
}
void linkListSort(LinkList &L)
// 将单链表L的节点重排,使其递增有序 2016-12-16
{
LNode *p=L->next, *pre;
LNode *r=p->next;
p->next=NULL;
p=r; //保存p->next,防止断链
while(p!=NULL){
r=p->next;
pre=L;
while(pre->next!=NULL && pre->next->data<p->data) //在有序表中查找插入 *p 的前驱节点 *pre,将*p插入到 *pre 之后
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=r; //扫描剩下的节点
}
}
/******************************
C 简单的格式化读取文本操作
笨蛋,
居然遇到了一个奇怪的后缀自增问题
2016-11-29
*******************************/
#include<stdio.h>
typedef struct people
{
char name[10];
int age;
}people; void readFile()
{
FILE *fp;
char ch;
if((fp=fopen("E:\\data.dat","r"))==NULL) {
printf("file cannot be opened/n");
}
people p[2];
int i=0;
while (!feof(fp))
{
fscanf(fp,"%s %d",&p[i].name, &p[i].age);
printf("%s %d\n",p[i].name, p[i].age);
i++;
}
fclose(fp);
}
/******************
二叉树相关算法
2016-11-26
//真是想跑去看会儿电影
********************/
#include<stdio.h>
#define MAXSIZE 500 typedef stuct BiTreeNode
{
int data;
BiTreeNode * lchild;
BiTreeNode * rchild;
}* BiTree; //非递归方法求解二叉树高度
int BtDepth(BiTree T)
{
if(!T)
return 0;
int front=-1,rear=-1;
int last=0,level=0;
BiTree Q[MAXSIZE];
Q[++rear]=T;
BiTree p;
while(front>rear)
{
p=Q[++front];
if(p->lchild)
Q[++rear]=p->lchild;
if(p->rchild)
Q[++rear]=p->rchild;
if(front==last)
{
level++;
last=rear; //last 指向下一层
}
return level;
}
} int Btdepth2(BiTree t)
{
if(!T)
return 0;
int ldep=Btdepth2(T->lchild);
int rdep=Btdepth2(T->rchild);
return ldep>rdep?ldep+1:rdep+1;
} bool IsComplete(BiTree T)
// 判断给定二叉树是否为完全二叉树
{
InitQueue(Q);
if(!T)
return 1;
EnQueue(Q,T);
while(!IsEmpty(Q))
{
DeQueue(Q,p);
if(p) //非空节点子孙入队(子孙可能为空指针)
{
EnQueue(Q,p->lchild);
EnQueue(Q,p->rchild);
}
else //节点为空,检查之后有没有非空节点,有的话就不是完全二叉树了
while(!IsEmpty(Q))
{
DeQueue(Q,p);
if(p)
return 0;
}
}
}
/*
栈的应用
括号匹配
2016-11-24
//真是智障
*/
#include<stdio.h>
#define MAXSIZE 500 /* 字符栈 */
char cStack[MAXSIZE];
int top=-1; bool BracketsChecks(char *str)
{
int i=0,top=-1;
while(str[i]!='\0')
{
switch(str[i]){
case '('://cStack[++top]='(';break;
case '['://cStack[++top]=str[i];break;
case '{':cStack[++top]=str[i];break;
case ')':if(cStack[top--]!='(') return false;break;
case '}':if(cStack[top--]!='{') return false;break;
case ']':if(cStack[top--]!='[') return false;break;
default: break;
}
i++;
}
if(top==-1)
return true;
return false;
} int main()
{
char str[]= "1+2*(5*6)+{5/7+[55+55]}";
if(BracketsChecks(str))
{
printf("OK\n");
}
return 0;
}
/***********************
2016-11-18
[矩阵]调整为阶梯矩阵
liu kun
> 指针动态传递二维数组
*************************/
#include<stdio.h>
#include<math.h>
#define EPSINON 1e-5 /* 主要数据结构 */
typedef float dataType;
struct rowinfo
{
int index;
int leftZeroCount;
};
dataType matrix[4][5]={0,0,1,2,1,1,2,3,4,5,0,0,1,2,1,0,1,2,3,4}; /* 浮点数判0 */
bool equalZero(dataType d)
{
return fabs(d)<EPSINON;
} /* 指针实现动态传递 */
void adaptMatrix(dataType ** matrix,dataType ** toMatrix, int m, int n)
/* m rows n columns*/
{
int i,j;
rowinfo rowlen[m];
for(i=0;i<m;i++)
{
rowlen[i].index=i;
for(j=0;j<n&&equalZero(*((dataType *)matrix+n*i+j));j++);
rowlen[i].leftZeroCount=j;
}
//sort the rowinfo array
for(i=1;i<m;i++)
{
rowinfo temp = rowlen[i];
for(j=i-1;rowlen[j].leftZeroCount>temp.leftZeroCount && j>=0; rowlen[j+1]=rowlen[j--]);
rowlen[j+1] = temp;
}
// copy to newMatrix
for(i=0;i<m;i++)
{
for(j=0;j<n;++j) *((dataType *)toMatrix+n*i+j)= *((dataType *)matrix+ n*rowlen[i].index +j);
}
} // Test main function
int main()
{ dataType toMatrix[4][5];
int columNum = sizeof(matrix[0])/sizeof(matrix[0][0]);
adaptMatrix((dataType **)matrix, (dataType **)toMatrix,4,columNum);
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<columNum;j++)
printf("%.2f ",toMatrix[i][j]);
printf("\n");
}
return 0;
}
/****************************************
打印杨辉三角
date: 2016-10-15
writer: liu kun
reference: 数据结构 殷人昆
*****************************************/
#include <iostream>
#include<iomanip>
#include "queue.h"
using namespace std; //控制数字间隔
char blank[3+1] = " ";
void YANGVI(int n)
{
Queue q;
EnQueue(q,1);EnQueue(q,1);
int i,j;QElemType s=0,t;
for(i=1;i<=n;i++)
{
cout<<endl;
// 每行起始位置排版
for(int bl_count=0;bl_count<n-i;bl_count++)
cout<<blank;
EnQueue(q,0);
for(j=1;j<=i+2;j++) //第 i 行的 i+2 个系数,包括一个 0
{
DeQueue(q,t);
EnQueue(q,s+t); //计算下一行系数并入队
s=t;
if(j!=i+2)cout<<setw(sizeof(blank)-1)<<s<<blank;
}
}
};
int main()
{
YANGVI(10);
return 0;
}
> queue.h #ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED
#define MAXSIZE 500
typedef int QElemType; typedef struct Queue{
int maxSize=MAXSIZE;
QElemType *data=new QElemType[maxSize];
int front=0;
int rear=front;
}Queue; void InitQueue(Queue &q); int EnQueue(Queue &q, QElemType x)
{
//check full
if((q.rear+1)%q.maxSize==q.front)
{
return 0;
}
else{
q.data[q.rear]=x;
q.rear = (q.rear+1)%q.maxSize;
return 1;
}
} int DeQueue(Queue &q,QElemType& x)
{
// check empty, ERROR code 1
if(q.rear==q.front) return 0;
else{
x = q.data[q.front];
q.front=(q.front+1)%q.maxSize;
return 1;
}
} int QueueEmpty(Queue &q)
{
if(q.rear==q.front)return 1;
else return 0;
} // 引用作为地址传值
int QueueFull(Queue &q)
{
return (q.rear+1)%q.maxSize==q.front;
} int QueueSize(Queue& q)
{
return (q.rear+q.maxSize-q.front)%q.maxSize;
}
#endif // QUEUE_H_INCLUDED
简单排序算法实现
simpleSort.h
#ifndef SIMPLESORT_H_INCLUDED
#define SIMPLESORT_H_INCLUDED
typedef int EleType; int RbinarySearch(EleType A[], const EleType x, int low, int high)
{
if(low>high) return -1;
int mid = (low+high)/2;
if(A[mid]==x)
return mid;
else
if(A[mid]>x)
{
high = mid -1;
return(binarySearch(A,x,low,high));
}
else
{
low = mid + 1;
return(binarySearch(A,x,low,high));
}
} int binarySearch(EleType A[], const EleType x, int low, int high)
{
while(low<=high){
int mid = (low+high)/2;
if(A[mid]==x)
return mid;
else if(A[mid]>x) high = mid -1;
else low = mid + 1;
}
return -1;
} int insertSort(EleType A[], int n)
/* 数组下标从0开始,n为元素个数 */
{
if(n<1) return 0;
register int i,j;
for(i=1;i<n;i++)
{
EleType tem=A[i];
for(j=i-1;j>=0 && A[j]>tem; A[j+1]=A[j--]);
A[j+1]=tem;
}
return 1;
} int selectSort(EleType A[], int n)
{
if(n<1) return 0;
int i,j;
for(i=0;i<n;i++)
{
int minInd=i;
for(j=i+1;j<n;j++)
{
if(A[j]<A[minInd])minInd = j;
}
EleType tem=A[i];
A[i]=A[minInd];
A[minInd]=tem;
}
return 1;
} int partion(EleType A[], int low, int high)
{
const EleType pivot = A[low];
while(low<high)
{
while(low<high&&A[high]>=pivot) high--;
A[low]=A[high];
while(low<high&&A[low]<pivot) low++;
A[high] = A[low];
}
A[high]=pivot;
return high;
} int quickSort(EleType A[], int n, int low, int high)
{
if(n<1) return 0;
if(low>high) return 1;
int p = partion(A,low,high);
quickSort(A,n, low, p-1);
quickSort(A,n, p+1, high);
return 1;
} #endif // SIMPLESORT_H_INCLUDED
或者使用标准库里提供的排序函数,到这儿就算是使用说明书上的知识了。
#include<stdio.h>
#include<stdlib.h> int A[] = {5,4,6,8,8,7,9,1,3,2,0};
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
} int main()
{
int i;
int testNum = sizeof(A)/sizeof(int);
qsort(A,testNum ,sizeof(A[0]),cmp);
for(i=0;i<testNum;i++)
printf("%d ",A[i]);
return 0;
}
/*
2016-11-17
判断字符串是否中心对称
*/
#include<stdio.h>
#include<string.h>
#define MAXSIZE 500 char str[] = "ehhhe";
bool isSymmetry(char * str)
{
char stack[MAXSIZE]="";
int top=-1;
int leftPart = strlen(str)/2;
int rightBegin = (1+strlen(str))/2;
int i;
for(i=0;i<leftPart;++i)
{
stack[++top]=str[i];
}
int strL = strlen(str);
for(i=rightBegin;i<strL;++i)
{
if( !str[i]==stack[top--] ) return false;
/*
if(str[i]==stack[top])
top--;
else
return false;
*/
}
return true;
} int main()
{
if(isSymmetry(str))
printf("%s", "Format OK!\n");
return 0;
}
/*
2016-11-17
判断字符串是否中心对称
P64 04
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 500 typedef struct charNode{
char data;
charNode * next;
}charNode; char str[] = "abcba"; void initCharNode(charNode *head, char * str)
{
int i;
charNode * p=head;
for(i=0;i<strlen(str);i++)
{
charNode * cnode = (charNode *)malloc(sizeof(charNode));
cnode->data=str[i];
cnode->next=NULL;
p->next = cnode;
p=cnode;
}
} bool isSymmetry(charNode *hd, const int n)
{
char stack[MAXSIZE]="";
int top=-1;
int leftPart = n/2;
int rightBegin = (n+1)/2;
int i;
charNode * p=hd;
for(i=0;i<leftPart;++i)
{
p=p->next;
stack[++top]=p->data;
}
if(n%2!=0) p=p->next;
for(i=rightBegin;i<n;++i)
{
p=p->next;
if( p->data !=stack[top--]) return false;
}
return true;
} int main()
{
charNode * hdnode = (charNode *)malloc(sizeof(charNode));
initCharNode(hdnode, str);
if(isSymmetry(hdnode,strlen(str)))
printf("%s", "Format OK!\n");
return 0;
}