成都理工大学TCPIP实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1本科生实验报告实验课程计算机网络与TCP/IP协议体系(2)学院名称信息科学与技术学院专业名称通信工程学生姓名杜立华学生学号201313070112指导教师刘飚实验地点6B603实验成绩二〇一五年二月——二〇一五年六月2实验一Linux内核通用链表的使用实验目的学习Linux内核通用链表的设计原理,熟练掌握Linux内核通用链表的使用。实验内容1、掌握Linux通用链表的创建2、掌握通用链表添加元素、删除元素和遍历链表的方法3、掌握通用链表的查找方法实验要求待创建的链表头变量名为user_queue。作为链表的宿主节点类型定义如下:structuser{intid;/*userid*/structlist_headlist;};针对上述user_queue链表,要求以队列方式向其中依次添加10个类型为structuser的宿主节点,并要求这10个宿主节点的id依次为1—10依次遍历输出这10个宿主节点的id从链表中删除首个宿主节点,然后依次遍历该队列并输出余下各宿主节点的id在structuser结构体中增加一个username字段,用于存储该用户名字,重新以队列方式向其中依次添加10个类型为structuser的宿主节点,并要求这10个宿主节点的id依次为1—10在链表中搜索id值为5的节点,并输出该节点username值实现原理Linux的内核源文件list.h提供了所有的链表定义,以及各类链表的操作接口和实现。其中创3建链表的方法如下:LIST_HEAD(my_list);源文件list.h中定义了如下若干接口,用于对通用链表进行各种操作:在指定的head后插入新节点,常用于堆栈数据结构的实现//@newsk:即将添加的新链表节点//@head:在此节点后添加list_add(structlist_head*new,structlist_head*head);在指定的head前插入新节点,常用于队列数据结构的实现//@newsk:即将添加的新链表节点//@head:在此节点前添加list_add_tail(structlist_head*new,structlist_head*head);从链表中删除一个指定节点//@entry:要从链表中删除的节点list_del(structlist_head*entry);根据当前链表节点指针ptr获得宿主节点指针//@ptr:structlist_head类型的指针//@type:链表节点所在的宿主节点的类型//@member:嵌入宿主的链表节点的变量名list_entry(ptr,type,member);遍历链表//@pos:遍历链表时用于指示正在遍历的链表节点的指针//@head:链表头list_for_each(pos,head);实现代码和运行结果请打印本实验的程序代码和程序运行截图,并作为附件附在本实验报告后。#includestdio.h#includemalloc.h#includelist.hstructuser4{intid;structlist_headlist;};intmain(void){structuser*p;LIST_HEAD(user_queue);for(inti=0;i10;i++){p=(structuser*)malloc(sizeof(structuser));p-id=i;list_add_tail(&p-list,&user_queue);}structlist_head*q;list_for_each(q,&user_queue){p=list_entry(q,structuser,list);printf(%d\n,p-id);}return0;}#includestdio.h#includemalloc.h#includelist.hstructuser{charusername[20];intid;structlist_headlist;5};intmain(void){structuser*p;LIST_HEAD(head);for(inti;i10;i++){p=(structuser*)malloc(sizeof(structuser));p-id=i+1;printf(user%2d,Pleaseinputusername:,i+1);scanf(%s,p-username);list_add_tail(&(p-list),&head);}structlist_head*tmp;list_for_each(tmp,&head){p=list_entry(tmp,structuser,list);printf(%d\t%s\n,p-id,p-username);}list_for_each(tmp,&head){p=list_entry(tmp,structuser,list);if(p-id==5)printf(%s\n,p-username);}return0;}6实验二Linux内核通用哈希链表的使用实验目的学习Linux内核通用哈希链表的设计原理,熟练掌握Linux内核通用哈希链表的使用。实验内容1、掌握Linux通用哈希链表的创建。2、掌握通用哈希链表添加元素、查找元素的方法。实验要求1、待创建的哈希链表头数组为structhlist_headuser_hash[16],要求对该哈希链表宿主节点的name成员值进行散列,并将散列值与15进行与运算作为哈希链表宿主元素的哈希值。2、对该哈希表的所有表头元素进行初始化,初始化操作如下,其中index的变化范围为0~15。INIT_HLIST_HEAD(&user_hash[index]);3、作为哈希链表元素的的宿主节点类型定义如下:structusermap{structhlist_nodehlist;unsignedcharname[8];};4、针对上述user_hash哈希链表,要求向其中添加3个类型为structusermap的宿主节点,并要求这3个宿主节点的name成员分别为”smith”,”john”,”bob”,如下图所示:7structhlist_headuser_hash[16]012...155、向哈希表user_hash中添加2个新宿主元素,其中一个宿主元素的name成员为”john”,另外一个宿主元素的name成员为”lisa”。要求若新宿主元素的name成员已经存在,则提示已经存在该用户,不再向哈希链表中加入该已经存在的宿主节点,否则向哈希链表中添加该新宿主元素。6、遍历整个哈希表,输出所有表中已存在的宿主节点元素的name。实现原理Linux的内核源文件list.h提供了哈希链表的各种操作接口和实现。其中创建具有16个元素的哈希链表的方法如下:structhlist_headuser_hash[16];在上述user_hash数组的16个元素中存放的哈希表头元素定义如下:structhlist_head{structhlist_node*first;};哈希链表节点元素定义如下:structhlist_node{structhlist_node*next,**pprev;structusermapstructusermap...structhlist_node8};本实验对哈希链表宿主节点的name值进行散列的算法如下:unsignedintBKDRHash(unsignedchar*str);{unsignedintseed=131;unsignedinthash=0;while(*str){hash=hash*seed+(*str++);}return(hash&0x7FFFFFFF);}于是,本实验对一个字符串name求最终哈希值hash的方法如下:unsignedinthash=BKDRHash(name)&15;内核源文件list.h定义了以下若干接口,用于对哈希链表进行各种操作:(1)在指定的哈希链表头h所指向的链表头插入新节点//@n:要添加的新哈希链表节点//@h:在此哈希链表头节点后添加hlist_add_head(structhlist_node*n,structhlist_head*h);(2)根据当前哈希链表节点指针ptr获得好像链表宿主节点指针//@ptr:structhlist_node类型的指针//@type:哈希链表节点所在的宿主节点的类型//@member:嵌入宿主的哈希链表节点的变量名9hlist_entry(ptr,type,member);(3)遍历哈希链表中某个key值所对应的链表//@tpos:哈希链表宿主节点指针//@pos:哈希链表节点指针//@head:哈希链表中某key所对应的链表的头指针//@member:嵌在哈希链表宿主节点中的哈希链表节点的变量名hlist_for_each_entry(tpos,pos,head,member);实现代码和运行结果请打印本实验的程序代码和程序运行截图,并作为附件附在本实验报告后。#includestdio.h#includestring.h#includelist.hstructusermap{structhlist_nodehlist;unsignedcharname[8];};voidhlist_print(structhlist_head*hl_head);unsignedintBKDRHash(unsignedchar*str);unsignedcharhash_add(structhlist_node*hl_node,structhlist_head*hl_head);intmain(void){structhlist_headuser_hash[16];for(inti=0;i16;i++)INIT_HLIST_HEAD(&user_hash[i]);structusermapuser[3];strcpy(user[0].name,smith);strcpy(user[1].name,john);strcpy(user[2].name,bob);for(inti=0;i3;i++)hlist_add_head(&(user[i].hlist),&user_hash[BKDRHash(user[i].name)&15]);hlist_print(user_hash);structusermapnew_user[2];strcpy(new_user[0].name,john);10strcpy(new_user[1].name,lisa);for(inti=0;i2;i++)if(!hash_add(&(new_user[i].hlist),&user_hash[BKDRHash(new_user[i].name)&15]))printf(用户%s重复,添加失败!\n,new_user[i].name);hlist_print(user_hash);return0;}voidhlist_print(structhlist_head*hl_head){structusermap*puser;structhlist_node*phnode;for(inti=0;i16;i++){printf(%d\t,i);hlist_for_each_entry(puser,phnode,&hl_head[i],hlist)printf(%s\t,puser-name);printf(\n);}}unsignedintBKDRHash(unsignedchar*str){unsignedintseed=131;unsignedinthash=0;while(*str){hash=hash*seed+(*str++);}return(hash&0x7FFFFFFF);}unsignedcharhash_add(structhlist_node*hl_no

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功