1 #define struct s * tPS 和 typedef struct s * tPS 哪个好,为什么?
1)关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能。
Define则是宏定义,发生在预处理阶段,也就是编译之前,它只进行简单而机械的字符串替换,而不进行任何检查。
2)Typedef用来定义类型的别名,这些类型不只包含内部类型(int,char等),还包括自定义类型(如struct),可以起到使类型易于记忆的功能。
3)#define没有作用域的限制,只要是之前预定义过的宏,在以后的程序中都可以使用。而typedef有自己的作用域。
4)二者修饰指针类型时,作用不同。
2 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
C++中多了重载。也就是说,函数名一样,函数的参数和返回值可以不同。
为了做到这个,函数在编译时都会重新命名。而用C编译器编译的函数没有按这种规则重新命名,那么你加上extern,告诉c++编译器,这是C编译器编译的程序,要按C的命名方式来识别函数。该函数的调用规则是C的规则,调用时就不使用C++规则的带有参数信息的名字。
3 const int *const p ;说明两个const的作用。
第一个const表示p所指向的内容不能改变,第二个const表示p的内容不能改变。
4 数据比特位设置
#include <stdio.h>
#include <math.h>
void setBit(int *p,int m,bool bt)
{
const int MAXLEN = 16;
int array[MAXLEN] = {0};
int i,n = *p;//n为数据拷贝
int nCount = 0;
while(n != 0)
{
array[nCount] = n % 2;//转化为二进制
n = n / 2;
if(nCount == m - 1)//找到要更改的位数
{
if(bt)//判断是否清零
{
array[nCount] = 1;
}
else
{
array[nCount] = 0;
}
}
nCount ++;
}
*p = 0;//把p指向最新的数据
for(i = 0;i < nCount;i ++)
{
*p += array[i] * pow(2,i);
}
}
int main()
{
int a = 6;
int *p = &a;
setBit(p,1,true);
printf("%d\n",*p);
return 0;
}
5 已知链表的结构
struct node {
int value;
struct node *pNext;
};
typedef struct node* PLTIDNA;
PLTIDNA pHead = NULL,pTail = NULL;
pHead,pTail表示链表的全局头指针,和全局尾指针;求删除其中一个节点的算法。
int Delete(PLTIDNA pNode)
具体实现过程:(main为测试代码,关键是要讲究完整性,不能有疏忽)
#include <stdio.h>
#include <malloc.h>
struct node {
int value;
struct node *pNext;
};
typedef struct node* PLTIDNA;
PLTIDNA pHead = NULL,pTail = NULL;
int Delete(PLTIDNA pNode)
{
PLTIDNA p,q;
if(pHead == NULL)
{
printf("List is NULL.\n");
}
p = pHead;
while((p != pNode) && (p->pNext != NULL))
{
q = p;
p = p->pNext;
}
if(p == pNode)
{
if(p == pHead)
{
pHead = p->pNext;
}
else if(p == pTail)
{
pTail = q;
pTail->pNext = NULL;
}
else
{
q->pNext = p->pNext;
}
free(p);
return 1;
}
else
{
printf("this node not been found!\n");
}
return 0;
}
int insert(PLTIDNA p0)
{
PLTIDNA p,q;
p = pHead;
if(p == NULL)
{
pHead = p0;
pTail = p0;
pTail->pNext = NULL;
}
else
{
while((p0->value > p->value) && (p->pNext != NULL))
{
q = p;
p = p->pNext;
}
if(p0->value <= p->value)
{
if(p == pHead)
{
pHead = p0;
}
else
{
q->pNext = p0;
}
p0->pNext = p;
}
else
{
pTail = p0;
p->pNext = pTail;
pTail->pNext = NULL;
}
}
return 1;
}
int main()
{
PLTIDNA p1,p2,p3,p4,p5,p6;
p1 = (PLTIDNA)malloc(sizeof(struct node));
p2 = (PLTIDNA)malloc(sizeof(struct node));
p3 = (PLTIDNA)malloc(sizeof(struct node));
p4 = (PLTIDNA)malloc(sizeof(struct node));
p5 = (PLTIDNA)malloc(sizeof(struct node));
p6 = (PLTIDNA)malloc(sizeof(struct node));
p1->value = 1;
p2->value = 2;
p3->value = 3;
p4->value = 4;
p5->value = 5;
p1->pNext = p2;
p2->pNext = p3;
p3->pNext = p4;
p4->pNext = p5;
p5->pNext = NULL;
p6->value = 7;
pHead = p1;
pTail = p5;
printf("%d\n",Delete(p5));
insert(p6);
PLTIDNA tmp = pHead;
while(tmp != NULL)
{
printf("%2d",tmp->value);
tmp = tmp->pNext;
}
printf("\n");
printf("%d,%d\n",pHead->value,pTail->value);
return 0;
}