实验报告_线性表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子科技大学实验报告
课程名称:数据结构与算法
学生姓名:
学号:
点名序号:
指导教师:
实验地点:基础实验大楼
实验时间:4月3日
2014-2015-2学期
信息与软件工程学院
实验报告(一)
学生姓名:学号:指导教师:
实验地点:基础实验大楼实验时间:4月3日
一、实验室名称:软件实验室
二、实验项目名称:数据结构与算法—线性表的实现
三、实验学时:4
四、实验原理:
在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
链式存储方式即可以用于表示线性结构,也可用于表示非线性结构。
一般来说,在线性表的链式存储结构中,各数据结点的存储符号是不连续的,并且各结点在存储空间中的位置关系与逻辑关系也不一致。
对于线性链表,可以从头指针开始,沿各结点的指针扫描到链表中的所有结点。
线性表的链接存储中,为了方便在表头插入和删除结点的操作,经常在表头结点(存储第一个元素的结点)的前面增加一个结点,称之为头结点或表头附加结点。
这样原来的表头指针由指向第一个元素的结点改为指向头结点,头结点的数据域为空,头结点的指针域指向第一个元素的结点。
五、实验目的:
本实验通过定义单向链表的数据结构,设计创建链表、插入结点、遍历结点等基本算法,使学生掌握线性链表的基本特征和算法,并能熟练编写C 程序,培养理论联系实际和自主学习的能力,提高程序设计水平。
六、实验内容:
使用数据结构typedef struct node {
Elemtype data;
struct node *next;
} ListNode, *ListPtr;
typedef struct stuInfo {
char stuName[10]; /*学生姓名*/
int Age /*年龄*/
} ElemType
实现带头结点的单向链表的创建、删除链表、插入结点等操作,并能实现年龄递增的两个单向链表合并一个链表,合并后的链表按年龄递减,可认为同名同年龄是同一个学生,每个学生在合并后的链表中仅出现一次。
最后打印输出合并后的链表元素,验证结果的正确性。
七、实验器材(设备、元器件):
PC机一台,装有C语言集成开发环境。
八、数据结构与程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
int age;
char stuName[10];
struct node *next;
}ListNode,*Listptr;
int List_Reverse(ListNode *L)
{
ListNode *q,*p=L->next;
L->next = NULL;
while(p)
{
q=p;
p=p->next;
q->next = L->next;
L->next = q;
}
return 1;
}
void List_Insert (ListNode *p,int x,char name[10])
{
ListNode *s;
s=(ListNode*)malloc(sizeof(ListNode));
s->next=NULL;
ListNode *p1 ,*q1 , *u, *pre;
s->age =x;
strcpy(s->stuName,name);
p1=p->next;
pre=p;
while(p1!= NULL)
{
if(p1->age >= s->age)
{
s->next=p1;
pre->next=s;
pre=s;
break;
}
else
{
pre=p1;
p1=p1->next;
}
}
if(s->next == NULL)
pre->next=s;
}
void List_Destroy(ListNode *pc)
{
pc->next=NULL;
printf("free successful");
}
int List_Merge(ListNode *pa1, ListNode *pb1) { ListNode *p1 ,*q1 , *u, *pre, *t;
p1=pa1->next;
q1=pb1->next;
pre=pa1;
while((p1!=NULL) && (q1!=NULL))
{
if((p1->age) > (q1->age) )
{
u=q1->next;
q1->next=p1;
pre->next=q1;
pre=q1;
q1=u;
}
else if((p1->age) == (q1->age) )
{
if(strcmp(p1->stuName,q1->stuName) == 0)
{u=q1->next;
q1=u;}
else
{pre=p1;
p1=p1->next;}
}
else
{
pre=p1;
p1=p1->next;
}
}
if(q1 != NULL)
pre->next = q1;
t=pa1->next;
while(t)
{
printf("%s %d\n",t->stuName,t->age);
t=t->next;
}
return 1;
}
void OutPut(ListNode*La)
{
ListNode *test;
test=La->next;
while(test)
{
printf("%s %d\n",test->stuName,test->age);
test=test->next;
}
}
int main(void){
printf("欢迎使用\n\n");
ListNode *p1 ,*q1 , *u, *pre;
ListNode *pa,*pb,*p,*q;
pa=(ListNode*)malloc(sizeof(ListNode));
pb=(ListNode*)malloc(sizeof(ListNode));
pa->next=NULL;
pb->next=NULL;
int oppr;
printf("(释放B链0 释放A链1 合并操作2 反转操作3 插入操作4 退出操作5 打印链表6)\n 请输入请求:");
scanf("%d",&oppr);
while(oppr !=5)
{
if(oppr ==0)
{
List_Destroy(pb);
printf("请输入指令");
scanf("%d",&oppr);
}
if(oppr ==1)
{
List_Destroy(pa);
printf("请输入指令");
scanf("%d",&oppr);
}
if(oppr ==2)
{
List_Merge(pa,pb);
printf("\n\n\n");
printf("请输入指令");
scanf("%d",&oppr);
}
if(oppr ==3)
{
List_Reverse(pa);
p=pa->next;
while(p)
{
printf("%s %d\n",p->stuName,p->age);
p=p->next;
}
printf("\n\n\n");
printf("请输入指令");
scanf("%d",&oppr);
}
if(oppr ==4)
{
char qq[10];
int ab;
printf("which line do you insert A-1 B-2?\n");
scanf("%d",&ab);
printf("insert the new data.\n");
printf("please insert the name:");
scanf("%s",qq);
int m;
printf("please insert the age:");
scanf("%d",&m);
if(ab ==1)
{ List_Insert (pa, m,qq);
printf("success in A\n\n");
p=pa->next;
while(p)
{
printf("%s %d\n",p->stuName,p->age);
p=p->next;
}
}
if(ab ==2)
{ List_Insert (pb, m,qq);
printf("success in B\n\n");
p=pb->next;
while(p)
{
printf("%s %d\n",p->stuName,p->age);
p=p->next;
}
}
printf("\n\n\n");
printf("请输入指令");
scanf("%d",&oppr);
}
if(oppr == 6)
{
printf("lINE A IS :");
OutPut(pa);
printf(" \n\nline B is :");
OutPut(pb);
printf("\n请输入指令");
scanf("%d",&oppr);
}
}
return 0;
}
九、程序运行结果:
十、实验结论:
实现了带头结点的单向链表的创建、删除链表、插入结点等操作,并能实现年龄递增的两个单向链表合并一个链表,合并后的链表按年龄递减,且
认为同名同年龄是同一个学生,使每个学生在合并后的链表中仅出现一次。
最后打印输出合并后的链表元素,验证了结果的正确性。
十一、总结及心得体会:
这次的线性表实验使我充分了解到线性表的巨大作用,掌握了线性表的创建、删除、插入、合并等操作。
使我能够用线性表实现许多功能,对程序又有了更深的了解,并且让我懂得了算法和结构的重要性,让我对这门课程有了更大的兴趣。