一.编程
1.请实现一个算法改变整除的存储结构,比如实现0x12345678到0x78563412
#include <stdio.h>
void reverse_dword(unsigned char* dwNum, int len)
{
if(len <= 1 || NULL == dwNum)
return;
unsigned char temp = *dwNum;
*dwNum = *(dwNum + len - 1);
*(dwNum + len - 1) = temp;
reverse_dword(dwNum + 1, len - 2);
}
int main()
{
int a = 0x12345678;
printf("%x\n", a);
reverse_dword(&a,4);
printf("%x\n", a);
return 0;
}
2.实现字符串"12345678"到整数12345678转换
#include <stdio.h>
int String2Int(char* str) //字符串转数字
{
char flag = '+';//指示结果是否带符号
long res = 0;
if(*str == '-')
{
++str; //指向下一个字符串
flag = '-'; //将标志设为符号
}
while(*str >= 48 && *str <= 57) //如果是数组才进行转换,数字0-9的ASCII码:48-57
{
res = 10*res + *str++ - 48; //字符'0'的ASCII码位48
}
if(flag == '-') //处理负数的情况
{
res = -res;
}
return (int)res;
}
int main()
{
char* str = "123456";
printf("%d\n",String2Int(str));
return 0;
}
3.整数转字符串
#include <stdio.h>
char* Int2String(int num,char *str)//10进制
{
int i = 0;//指示填充str
if(num<0)//如果num为负数,将num变正
{
num = -num;
str[i++] = '-';
}
//转换
do
{
str[i++] = num%10+48;//取num最低位 字符0~9的ASCII码是48~57;简单来说数字0+48=48,ASCII码对应字符'0'
num /= 10;//去掉最低位
}while(num);//num不为0继续循环
str[i] = '\0';
//确定开始调整的位置
int j = 0;
if(str[0]=='-')//如果有负号,负号不用调整
{
j = 1;//从第二位开始调整
++i;//由于有负号,所以交换的对称轴也要后移1位
}
//对称交换
for(;j<i/2;j++)
{
//对称交换两端的值 其实就是省下中间变量交换a+b的值:a=a+b;b=a-b;a=a-b;
str[j] = str[j] + str[i-1-j];
str[i-1-j] = str[j] - str[i-1-j];
str[j] = str[j] - str[i-1-j];
}
return str;//返回转换后的值
}
int main()
{
int num = 123456;
int num2 = -123456;
char string[16] = {0};
Int2String(num, string);
printf("%s\n",string);
Int2String(num2, string);
printf("%s\n",string);
return 0;
}
4.字符串倒叙
#include <stdio.h>
#include <string.h>
void StringReverse(char* str)
{
if(NULL == str)
return;
char* pBegin = str;
char* pEnd = str + strlen(str) - 1;
while(pBegin < pEnd)
{
char tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
pBegin++;
pEnd--;
}
}
int main()
{
char str[] = "123456789";
StringReverse(str);
printf("%s\n", str);
return 0;
}
5.链表
一个链表的数据结构
struct Node
{
int data;
struct Node* next;
};
typedef struct Node Node;
(1)已知链表的头结点head,写一个函数把这个链表逆序
Link_Node *ReverseLink(Link_Node* head)
{
Link_Node* next;
Link_Node* prev = NULL;
while(head != NULL)
{
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
(2)双链表逆序
list* reverselist(list* head)
{
if((NULL == head) || (NULL == head->next))
{
return head;
}
list* p1 = head->next;
list* p2 = p1->next;
list* p3 = NULL;
p1->next = NULL;
while(p2)
{
p3 = p2->next;
p2->next = p1;
p1->prior = p2;
p1 = p2;
p2 = p3;
}
head->next = p1;
p1->prior = head;
return head;
}