C语言函数调用问题,下面是例子 。当形参和实参定义的变量重名的时候,会不会发生冲突?为什么?不会发生冲突 。但主要是你不要被其困惑就是真的要做的了 。
因为这是C语言设计中的一个应用 。作用域的应用含义 。
函数所带参数的作用域只在该函数体中起到作用 。就相当于 , 函数内部声明的两个变量 。是局部变量 。
而主函数中的变量定义又是主函数当中的作用域 。主函数中变量的作用域是全局变量 。
两者自然不会冲突 。
C语言 数据结构中解决冲突的方法是什么可以参考如下方法:
1 基本原理
使用一个下标范围比较大的数组来存储元素 。可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素"分类",然后将这个元素存储在相应"类"所对应的地方 。
但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了"冲突",换句话说,就是把不同的元素分在了相同的"类"之中 。后面我们将看到一种解决"冲突"的简便做法 。
总的来说,"直接定址"与"解决冲突"是哈希表的两大特点 。
2 函数构造
构造函数的常用方法(下面为了叙述简洁,设 h(k) 表示关键字为 k 的元素所对应的函数值):
a) 除余法:
选择一个适当的正整数 p ,令 h(k ) = k mod p
这里, p 如果选取的是比较大的素数,效果比较好 。而且此法非常容易实现,因此是最常用的方法 。
b) 数字选择法:
如果关键字的位数比较多,超过长整型范围而无法直接运算,可以选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值 。
3 冲突处理
线性重新散列技术易于实现且可以较好的达到目的 。令数组元素个数为 S,则当 h(k) 已经存储了元素的时候 , 依次探查 (h(k)+i) mod S , i=1,2,3……,直到找到空的存储单元为止(或者从头到尾扫描一圈仍未发现空单元,这就是哈希表已经满了,发生了错误 。当然这是可以通过扩大数组范围避免的) 。
4 支持运算
哈希表支持的运算主要有:初始化(makenull)、哈希函数值的运算(h(x))、插入元素(insert)、查找元素(member) 。
设插入的元素的关键字为 x,A 为存储的数组 。
初始化比较容易,例如
const empty=maxlongint; // 用非常大的整数代表这个位置没有存储元素
p=9997; // 表的大小
procedure makenull;
var i:integer;
begin
for i:=0 to p-1 do
A[i]:=empty;
End;
哈希函数值的运算根据函数的不同而变化 , 例如除余法的一个例子:
function h(x:longint):Integer;
begin
h:= x mod p;
end;
我们注意到,插入和查找首先都需要对这个元素定位,即如果这个元素若存在,它应该存储在什么位置,因此加入一个定位的函数 locate
function locate(x:longint):integer;
var orig,i:integer;
begin
orig:=h(x);
i:=0;
while (iS)and(A[(orig+i)mod S]x)and(A[(orig+i)mod S]empty) do
inc(i);
//当这个循环停下来时,要么找到一个空的存储单元,要么找到这个元
//素存储的单元,要么表已经满了
locate:=(orig+i) mod S;
end;
插入元素
procedure insert(x:longint);
var posi:integer;
begin
posi:=locate(x); //定位函数的返回值
if A[posi]=empty then A[posi]:=x
else error; //error 即为发生了错误,当然这是可以避免的
推荐阅读
- 游戏开发35岁,游戏开发35岁后怎么发展
- 手机怎么改装图片大小尺寸,手机 改图片尺寸
- n650显卡怎么样,nvidia geforce650m
- java代码乘 java中的乘
- ios有什么看图的app,ios看图片软件哪个好
- 陈赫直播都卖了什么,陈赫直播都卖了什么产品
- 服务器给权限,服务器权限设置
- 怎么进mysql改密码 mysql密码更改
- 怎么看点过最多的视频号,怎样看视频号有多少关注