2011~2012学年 第 二 学期 级 计算机 专业
班级: 学号: 姓名:
实验一 线性表及其应用
一、 实验题目:
线性表及其应用——约瑟夫环 二、 实验内容:
1.设带头结点的单链表ha和hb中结点数据域值按从小到大顺序排列,且各自链表内无重复的结点,要求: (1)建立两个按升序排列的单链表ha和hb。
(2)将单链表ha合并到单链表hb中,且归并后的hb链表内无重复的结点,结点值仍保持从小到大顺序排列。
(3)输出合并后单链表hb中每个结点的数据域值。 代码: 实验结果:
struct Node { int data; Node* next; }; typedef Node Slink; void create(Slink* h); void show(Slink* h);
void merge(Slink* ha,Slink* hb); #include cout<<\"创建链表ha\"< void create(Slink* h) { if(!h) return; int n=0;//节点总数 int j=0;//累计创建结点个数 cout<<\"请输入创建节点的个数\"< Node* F=h;//F始终指向tou节点 Node* pre=h;//pre始终指向要插入位置的前一个节点 while(j 第 2 页 共 8 页 Node* p=new Node; cout<<\"请输入节点的数据\"< //链表不空时 while(pre->next ) { if(p->data if(!pre->next ) { pre->next =p; } p->next =NULL; j++; { p->next =pre->next ; } else if (p->data ==pre->next ->data) { cout<<\"该值已存在,请重新输入\"< break; pre->next =p; pre=h; j++; break; p->next =NULL; j++; continue; { //p遍历ha,q遍历hb Node * p=ha->next ; Node * q=hb->next ; //pw始终指向新生成链表的最后一个结点 Node * pw=hb; while(p&&q) { if((p->data)<(q->data)) { pw->next=p; p=p->next; pw=pw->next; continue; } if((p->data)>(q->data)) { pw->next=q; q=q->next; pw=pw->next; continue; } if((p->data)==(q->data)) { pw->next=q; p=p->next; q=q->next; pw=pw->next; continue; } } while(p) { pw->next=p; p=p->next; pw=pw->next; } while(q) { pw->next=q; q=q->next; pw=pw->next; } pw->next=NULL; void show(Slink* h) { Node* p=h->next ; while(p ) { cout< } 第 3 页 共 8 页} cout< 要求:利用不带头结点的循环单链表存储结构模拟此过程,按照出列的顺序输出各人的编号。 三、 程序源代码: struct person { int id; }; void show(int n,person* head); #include 第 4 页 共 8 页 int password; person* next; void main() { person head; head.next =&head; person* T=&head; //创建节点 cout<<\"请输入创建节点的个数\\n n=\"; int n; cin>>n; int i; for(i=0;i p->id =i+1; cout<<\"请输入第\"<>p->password ; p->next =T->next ; T->next =p; T=p; // if(T->next ==&head) //此句证明T指向最后一个节点 //cout<<\"dddddddddddddddddddddddddddd\"< person* q=NULL; //始终指向要删除的节点 int j=1; int count; while(j cout<<\"报数出列序列为 :\"< if(count==1) { q=F; 第 5 页 共 8 页 T->next =F->next ; F=T->next ; count=q->password ; cout< } //当只剩一个节点时 if(j==n) { cout< } //当密码大于1时,即每次报数上限大于1时 } void show(int n,person* head) { person* T=head; int h=n; cout<<\"节点ID\"<<\" \"<<\"对应密码\"< h--; } cout< T->next =F->next ; F=T->next ; count=q->password ; cout< } } 第 6 页 共 8 页 四、 测试结果: 五、小结(包括收获、心得体会、存在的问题及解决问题的方法、建议等) 注:内容一律使用宋体五号字,单倍行间距 通过本次试验,我更加熟悉结构体定义,使用,和指针使用。 在做实验过程中,一定要有清晰的思路,即算法要心里想明白。 此外,还有做到代码简练,实现简单,步骤容易看懂。这是我的缺点,在今后编程中我一定会勤加练习,尽量用简单的代码实现较多的功能。 第 7 页 共 8 页 第 8 页 共 8 页 因篇幅问题不能全部显示,请点此查看更多更全内容