实验六实验报告表
实验报告表 6 - 1打开文件过程演示实验记录表
实验报告表 6 - 2创建文件过程演示实验记录表
实验报告表 6 - 3删除文件过程实验记录表
第二篇:实验一 链表操作实验报告 (2)
实验内容
按实验内容与步骤阅读理解数据结构及主函数,并完成各子函数的功能。 #include <stdio.h>
#include <stdlib.h>
typedef struct node{
int num; //学号 float height; //身高 struct node *next;
}Node,*Link;
Link CreateLink();//创建链表
Link Delete(Link H,int n); //删除节点
Node *GetNode(Link H,int n);//获取节点
Link Sort(Link H); //排序链表
Link Insert(Link H,Node *N);//插入节点
int print(Link H);//输出
void main()
{
printf("\n\n****** ②:遍历2个链表 ******\n"); printf("\n遍历链表一:\n"); Link L1,L2; Node *N; printf("****** ①:创建两个链表 ******\n");//⑤⑥ printf("\n创建链表一\n\n"); L1=CreateLink(); printf("\n创建链表二\n\n"); L2=CreateLink();
print(L1); printf("\n遍历链表二:\n"); print(L2); printf("\n\n****** ③:删除第一个链表中的第二个节点 ******\n\n"); L1=Delete(L1,2); printf("删除后的链表一:\n"); print(L1); //printf("\n\n****** ④:将第一个链表中的第二个结点移动到第二个链表适当的位置 ******\n\n");
}
/***************************** 创建链表********************************/ /* 返回 表头节点 */
Link CreateLink()
{ //printf("获取链表一的第二个节点...\n"); N=GetNode(L1,2); //printf("为链表二排序..\n"); L2=Sort(L2); printf("将链表一的第二个结点移动到链表二的第一位\n"); if(N!=NULL) L2=Insert(L2,N); printf("移动后的链表一\n"); print(L1); printf("移动后的链表二\n"); print(L2);
Link H=NULL; Node *p,*q; int num=-1;//保存学号 float hei=-1.0;//保存身高 int min=1;//计数,至少插入3个节点 printf("请输入学号(学号-1则退出输入):num="); scanf("%d",&num); fflush(stdin); printf("\t\t请输入身高:hei="); scanf("%f",&hei); printf("\n"); fflush(stdin); while(num!=-1 || min<=3) { if(H==NULL) { } else { q=(Node *)malloc(sizeof(Node)); q->num=num; p=(Node *)malloc(sizeof(Node)); p->num=num; p->height=hei; p->next=NULL; min++; //计数加一 H=p;
} q->height=hei; q->next=NULL; min++; p->next=q; p=p->next;
lab1: printf("请输入学号(学号-1则退出输入):num=");
}
/*************************** 删除节点 *************************/ /* 参数 H 为 表头节点 */ /* 参数 n 为 删除第几个节点 */ Link Delete(Link H,int n)
{ } return H; if(num==-1 && min<=3) { } if(num==-1 && min>3) //退出输入 break; printf("\n请至少输入3个节点\n\n"); goto lab1; //跳到 lab1 scanf("%d",&num); fflush(stdin); printf("\t\t请输入身高:hei="); scanf("%f",&hei); printf("\n"); fflush(stdin);
} int i=1; Node *p,*q; if(n==1) //删除的是第一个节点 { } p=H; while(p!=NULL) { } if(i==(n-1))//存在n-1个节点 { } else { } return H; printf("不存在第%d个节点!\n",n); q=p->next; p->next=q->next; free(q); //释放q节点 if(i==(n-1)) //删除节点的前一个节点 break; H=H->next; return H; p=p->next; i++;
/*************************获取节点 *****************************/ /* 参数 H 为 表头节点 */ /* 参数 n 为 第几个节点 */ Node *GetNode(Link H,int n)
{
int i=1; Node *p,*q; p=H; q=H; if(n==1) //取的是第一个节点 { } while(p!=NULL) { } if(i==(n-1))//存在n-1个节点 { } else { q=p->next; p->next=q->next; return q; if(i==(n-1))//删除节点的前一个节点 break; p=p->next; return p; p=p->next; i++;
} } printf("不存在第%d个节点!\n",n); return NULL;
/**************************** 排序*********************************/ /* 参数 H 为 表头节点 */
Link Sort(Link H)
{
Node *p,*q,*t; p=H; if(p->next==NULL)//链表只有一个节点 return H; t=(Node *)malloc(sizeof(Node)); q=p->next; while(p!=NULL) { while(q!=NULL) { } if (p->num > q->num)//按学号从小到大 { } q=q->next; t->num=p->num; t->height=p->height; p->num=q->num; p->height=q->height; q->num=t->num; q->height=t->height;
} } p=p->next; if(p!=NULL) q=p->next; return H;
/************************** 输出 *********************************/ /* 参数 H 为 表头节点 */
/* 参数 N 为 插入的节点节点 */
Link Insert(Link H,Node *N)
{
Node *p,*q; //q保存前一个节点 if(N->num < H->num) //插入在表头之前 { } p=H; q=H; while(p!=NULL) { if(N->num<=p->num) { } q=p; N->next=q->next; q->next=N; break; N->next=H; H=N; return H;
} } p=p->next; if(p==NULL) //插入在最后一个节点之后 { q->next=N; N->next=NULL; } return H;
/*********************** 输出 ********************/
/* 参数 H 为 表头节点 */ int print(Link H)
{
} Node *p; p=H; if(p==NULL) { } printf("\n\t学号\t\t身高\n"); while(p) { } return 0; printf("\t %d \t\t%f\n",p->num,p->height); p=p->next; printf("\n数据为空!!\n\n"); return 0;
完成情况:
(本部分详细描述运行结果情况,1)完成实验内容的要求;2)展示运行的结果。要求能够反映出算法的特点;要求穷举各种可能的结果、不能穷举的列出各种可能的分类情况;要求有文字说明和截图)
利用Visual C++ 6.0编译环境编辑程序,调试成功后进行运行程序。
第一, 创建第一个链表,以学号和身高作为一组数据,链表一共输入四组数据分别是:
【1,165】【2,166】【3,156】【4,177】.
第二, 输完数据后以-1结束链表一的创建,并开始创建第二个链表。
第三, 创建第一个链表,以学号和身高作为一组数据,链表共输入四组数据分别是:
【5,167】【6,166】【7,167】【8,165】.
第四, 输完数据后以-1结束链表二的创建,并确认输入结束,开始程序的结果输出。 第五, 输出结果如下图所示。
解决方案:
解决方案:
问题一解决方法:增加一个计数变量min,当min小于3时给出提示并跳会到lab1继续导入数据,代码如下: lab1: printf("请输入学号(学号-1则退出输入):num=");
问题二解决方法:用嵌套的while循环,采用选择排序发,将链表排序。代码如下:
while(p!=NULL) scanf("%d",&num); fflush(stdin); if(num==-1 && min<=3) { } if(num==-1 && min>3) //退出输入 break;//跳出while printf("\n请至少输入3个节点\n\n"); goto lab1; //跳到 lab1 { while(q!=NULL) { if (p->num > q->num)//按学号从小到大 { t->num=p->num; //交换数据 t->height=p->height; p->num=q->num; p->height=q->height; q->num=t->num; q->height=t->height; } q=q->next;
} } p=p->next; if(p!=NULL) q=p->next;
问题三解决方法:想要将链表一中的第二个结点移动到链表二适当的位置,则必须先取得链表一中的第二个结点。通过函数GetNode获取节点返回节点的地址。然后通过Insert将节点插入到链表二的适当位置 程序运行说明书
(本部分列出程序说明书,详细说明程序如何运行)
利用Visual C++ 6.0编译环境编辑程序,调试成功后进行运行程序。
1. 创建第一个链表,以学号和身高作为一组数据,链表一共输入四组数据分别是:
【1,165】【2,166】【3,156】【4,177】.
2. 输完数据后以-1结束链表一的创建,并开始创建第二个链表。
3. 创建第一个链表,以学号和身高作为一组数据,链表共输入四组数据分别是:
【5,167】【6,166】【7,167】【8,165】.
4. 输完数据后以-1结束链表二的创建,并确认输入结束,开始程序的结果输出。