不多BB,直接上代码
头文件
#include<iostream>
using namespace std;
typedef struct node {
int number;
struct node *next;
}*ptr;
将输入的数字转化为二进制数
#include"headfile.h"
using namespace std;
ptr magicxupan(int n, ptr p) {
void Insert(ptr, ptr, int);
ptr s, ss;
p = (ptr)malloc(sizeof(node));
p->number = 0;
ss = p;
s = NULL;
p->next = s;
while (n >= 1) {
if (n == 1) {
Insert(p, p->next, 1);
break;
}
int x = n % 2;
Insert(p, p->next, x);
n /= 2;
}
p = ss;
return p;
}
加工二进制数
#include"headfile.h"
using namespace std;
void remagicxupan(ptr p) {//将二进制码加工并在最后加上110作为逗号
void Insert(ptr, ptr, int);
ptr s = p;
while (p) {
if (p->number == 1) {
Insert(p, p->next,0);
p = p->next;
}
p = p->next;
}
p = s;
while (p->next) {
p = p->next;
}
//}
Insert(p, p->next, 1);
p = p->next;
Insert(p, p->next, 1);
p = p->next;
Insert(p, p->next, 0);
p = p->next;
Insert(p, p->next, 0);
p = p->next;
Insert(p, p->next, 0);
p = p->next;
Insert(p, p->next, 0);
//p = s;
//return p;
}
将加工后的二进制码根据相应图灵机算法的法则再编码
#include"headfile.h"
using namespace std;
void bianma(ptr p) {//按照图灵机的计算乘法的法则
ptr q = p;
int flag = 0;
//cout << p->number << endl;
while (p) {
//p = p->next;
if (flag == 0 && p->number == 0)
p = p->next;
else if (flag == 0 && p->number == 1) {
flag = 1;
p->number = 0;
p = p->next;
}
else if (flag == 1 && p->number == 0) {
flag = 0;
p->number = 1;
p = p->next;
}
else if (flag == 1 && p->number == 1) {
flag = 10;
p->number = 0;
p = p->next;
}
else if (flag == 10 && p->number == 0) {
flag = 11;
p->number = 1;
p = p->next;
}
else if (flag == 11 && p->number == 0) {
flag = 0;
p->number = 1;
break;
}
}
}
将编码后得到的二进制码解码
#include"headfile.h"
using namespace std;
int jiema(ptr p) {
void Delete(ptr);
ptr fanzhuan(ptr);
int mi(int, int);
ptr s = p;
while (p) {
if (p->next->number == 1 && p->next->next->number == 1) {
p->next = NULL;
break;
}
if (p->number == 1)
Delete(p);
p = p->next;
}
p = s;//ÈÃpÖØÐÂÖ¸ÏòÍ·½Úµã
p = fanzhuan(p);
int i = 0;
int sum = 0;
while (p) {
if (p->number == 1) {
sum += mi(2, i);
}
p = p->next;
i++;
}
return sum;
}
这些过程需要的函数有:1.在链表中插入节点的函数
2.删除链表节点的函数
3.反转链表的函数(为了解码方便,也可以不反转)
4.计算m的n次幂的函数
不多BB,全贴出来。
插入节点的函数
#include"headfile.h"
void Insert(ptr a, ptr b, int c) {//在a和b之间插入一个节点,number属性为c
ptr flag;
flag = (ptr)malloc(sizeof(node));
flag->number = c;
flag->next = b;
a->next = flag;
}
删除节点的函数
#include"headfile.h"
using namespace std;
void Delete(ptr p) {//删除p节点后面的一个节点
ptr s;
s = p->next;
p->next = p->next->next;
free(s);
}
反转链表的函数
#include"headfile.h"
//using namespace std;
ptr fanzhuan(ptr p) {
ptr p1 = p;
ptr s = NULL, m = NULL, n = p;
while (p->next) {
s = p->next;
m = s->next;
p->next = m;
s->next = n;
n = s;
s = m;
}
return n;
}
求m的n次幂的函数
int mi(int n, int m) {//n的m次幂
int sum = 1;
if (m == 0)
return 1;
for (int i = 0; i < m; i++) {
sum *= n;
}
return sum;
}
入口函数
#include"headfile.h"
using namespace std;
int main() {
ptr magicxupan(int, ptr);
void remagicxupan(ptr);
void bianma(ptr);
ptr fanzhuan(ptr);
int jiema(ptr);
ptr p=NULL;
int i;
cout << "输入一个数字" << endl;
cin >> i;
getchar();
cout << "这是变成二进制码的数字" << endl;
p=magicxupan(i, p);
ptr s = p;
while (p) {
cout << (p->number);
p = p->next;
}
cout << endl;
p = s;
cout << "这是加0后和逗号的二进制码" << endl;
remagicxupan(p);
///
while (p) {
cout << (p->number);
p = p->next;
}
cout << endl;
p = s;
bianma(p);
cout << "这是用乘法法则之后的二进制码" << endl;
while (p) {
cout << (p->number);
p = p->next;
}
cout << endl;
p = s;
/*
p = fanzhuan(p);
if (!p)
cout << "eeeeeeeeeeeeeeeeeeeeee" << endl;
while (p) {
cout << (p->number) << endl;
p = p->next;
}*/
cout << "这是最后的数字" << endl;
int haha = jiema(p);
cout << haha<<endl;
getchar();
return 0;
}
结束了。。。。。