参加笔试的总结

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;
	
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值