数据结构实验报告-答案

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
strcpy(head->data,ch); p=(LinkList)malloc(sizeof(ListNode)); p->next=head; head=p; } } else break; } return head; }
//========== 按值查找结点,找到则返回该结点的位置,否则返回
return p; //若 p=NULL 则查找失败,否则
}
// 直到 p 为 NULL 或 p->data 为 key 止 p 指向找到的值为 key 的结点
//========== 修改程序:增加节点 ListNode * AddNode(LinkList head) {
char ch[10]; ListNode *s,*pp;
mat, lat, jat, fat, eat, put, cat, bat, 请按任意键继续 . . .
示意图:
head
mat
lat
jat
hat
fat
eat
cat
bat
NULL
head
mat
lat
jat
fat
eat
cat
bat
NULL
hat
head
mat
lat
jat
fat
eat
cat
bat
NULL
实验主要步骤:
1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如: bat,cat,eat, fat, hat,jat , lat, mat, #),测试程序
的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序:
( 1) 增加插入结点的功能。 ( 2) 将建立链表的方法改为头插入法。
scanf("%s",ch);
//输入要删除的字符串
DeleteList(head,ch);
printlist(head);
}
printf(" Add node ? (y/n):"); //输入 "y" 或 "n" 去选择是否增加结点
scanf("%s",num);
if(strcmp(num,"y")==0 || strcmp(num,"Y")==0)
s=(ListNode *)malloc(sizeof(ListNode));
strcpy(s->data,ch);
printf("ok3\n");
s->next=head->next; head->next=s; }
return head;
}
//========== 删除带头结点的单链表中的指定结点 =======
{
ListNode *p=head,*r;
while(p->next){
r=p->next;
free(p);
p=r;
}
free(p);
}
实验结果: Input # to end Please input Node_data:bat Input # to end Please input Node_data:cat Input # to end Please input Node_data:eat Input # to end Please input Node_data:fat Input # to end Please input Node_data:hat Input # to end Please input Node_data:jat Input # to end Please input Node_data:lat Input # to end Please input Node_data:mat Input # to end Please input Node_data:# mat, lat, jat, hat, fat, eat, cat, bat, Delete node (y/n):y Please input Delete_data:hat mat, lat, jat, fat, eat, cat, bat, Insert node (y/n):y Please input Insert_data:put position :5
ListNode * AddNode();
// 修改程序:增加节点。用头插法,返回头指针
//========== 主函数 ==============
void main()
{
char ch[10],num[5];
LinkList head;
head=CreatList();
// 用头插入法建立单链表,返回头指针
exit(0);
}
while(q->next!=p)
//p 为要删除的结点, q 为 p 的前结点
q=q->next;
r=q->next;
q->next=r->next;
free(r);
// 释放结点
}
//=========== 打印链表 =======
void printlist(LinkList head)
{
ListNode *p=head->next; while(p){
// 从开始结点打印
printf("%s, ",p->data);
p=p->next;
}
printf("\n");
}
//========== 删除所有结点,释放空间 ===========
void DeleteAll(LinkList head)
//定义结点
// 结点的数据域为字符串 // 结点的指针域
// 自定义 LinkList 单链表类型 // 函数,用尾插入法建立带头结点的单链表 //函数,用头插入法建立带头结点的单链表
// 函数,按值查找结点 // 函数,删除指定值的结点 //函数,打印链表中的所有值 //函数,删除所有结点,释放内存
// 按值查找结点,返回结点指针
if(pp==NULL) {
//没有重复的字符串,插入到链表中
s=(ListNode *)malloc(sizeof(ListNode)); strcpy(s->data,ch);
r->next=s;
r=s;
r->next=NULL;
}
printf("Input # to end ");
数据结构 (C 语言版 ) 实验报告
专业
班级
学号
姓名
实验 1
实验题目 :单链表的插入和删除
实验目的 :
了解和掌握线性表的逻辑结构和链式存储结构, 能分析。
掌握单链表的基本算法及相关的时间性
实验要求:
建立一个数据域定义为字符串的单链表, 字符串,先找到相应的结点,后删除之。
在链表中不允许有重复的字符串; 根据输入的
程序代码 :
#include"stdio.h" #include"string.h" #include"stdlib.h" #include"ctype.h" typedef struct node {
char data[10]; struct node *next; }ListNode; typedef ListNode * LinkList; LinkList CreatListR1(); LinkList CreatList(void); ListNode *LocateNode(); void DeleteList(); void printlist(); void DeleteAll();
NULL==========
ListNode *LocateNode(LinkList head, char *key)
{
ListNode *p=head->next; // 从开始结点比较
while(p!=NULL && strcmp(p->data,key)!=0)
p=p->next;
//扫描下一个结点
如 ABD###CE##F## ,建立二叉树,求出先序、中序和后序以及按层次遍历序列, 求所有叶子及结点总数。
实验代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define Max 20
//结点的最大个数
typedef struct node{
void DeleteList(LinkList head,char *key)
{
ListNode *p,*r,*q=head;
p=LocateNode(head,key); // 按 key 值查找结点的
if(p==NULL ) {
// 若没有找到结点,退出
printf("position error");
printlist(head);
// 遍历链表输出其值
printf(" Delete node (y/n):"); // 输入 "y" 或 "n" 去选择是否删除结点
scanf("%s",num);
if(strcmp(num,"y")==0 || strcmp(num,"Y")==0){
printf("Please input Delete_data:");
//===== 要求输入先序序列,其中加入虚结点 "#" 以示空指针的位置 ==========
BinTree CreatBinTree(void)
{
BinTree T;
char ch;
char data;
struct node *lchild,*rchild;
}BinTNode;
// 自定义二叉树的结点类型
typedef BinTNode *BinTree;
// 定义二叉树的指针
int NodeNum,leaf;
//NodeNum 为结点数, leaf 为叶子数
//========== 基于先序遍历算法创建二叉树 ==============
put
心得体会:
本次实验使我们对链表的实质了解更加明确了, 对链表的一些基本操作也更加熟练了。 另外 实验指导书上给出的代码是有一些问题的, 这使我们认识到实验过程中不能想当然的直接编 译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。
实验 2
实验题目 :二叉树操作设计和实现
实验目的 :
printf("Please input Node_data:");
scanf("%s",ch);
}
return head;
//返回头指针
}
//========== 用头插入法建立带头结点的单链表 LinkList CreatList(void) {
char ch[100]; LinkList head,p; head=(LinkList)malloc(sizeof(ListNode)); head->next=NULL;
{
head=AddNode(head);
}
printlist(head);
DeleteAll(head);
// 删除所有结点,释放内存
}
//========== 用尾插入法建立带头结点的单链表 ===========
LinkList CreatListR1(void)
{wenku.baidu.com
char ch[10];
LinkList head=(LinkList)malloc(sizeof(ListNode)); // 生成头结点
ListNode *s,*r,*pp;
r=head;
r->next=NULL;
printf("Input # to end "); //输入 "#" 代表输入结束
printf("\nPlease input Node_data:");
scanf("%s",ch);
// 输入各结点的字符串
while(strcmp(ch,"#")!=0) { pp=LocateNode(head,ch);
掌握二叉树的定义、性质及存储方式,各种遍历算法。
实验要求:
采用二叉树链表作为存储结构, 完成二叉树的建立, 的操作,求所有叶子及结点总数的操作。
先序、 中序和后序以及按层次遍历
实验主要步骤:
1、分析、理解程序。 2、调试程序, 设计一棵二叉树, 输入完全二叉树的先序序列, 用 #代表虚结点 (空指针),
===========
while(1) {
printf("Input # to end "); printf("Please input Node_data:"); scanf("%s",ch); if(strcmp(ch,"#")) {
if(LocateNode(head,ch)==NULL) {
=======
printf("\nPlease input a New Node_data:");
scanf("%s",ch);
// 输入各结点的字符串
pp=LocateNode(head,ch); printf("ok2\n");
// 按值查找结点,返回结点指针
if(pp==NULL) {
//没有重复的字符串,插入到链表中
相关文档
最新文档