当前位置:文档之家› 第二次课内实验

第二次课内实验

课内实验报告学生姓名:郭长文1009290117 及学号:胡志强1009290118张学林1009290138 学院: 理学院班级: 信计101课程名称:数据结构实验题目:单链表的基本操作指导教师郭新辰教授姓名及职称:胡建平副教授刘力实验师2011年 10月 1 日目录一、实验目的 (1)二、实验内容 (1)三、实验要点及说明 (1)四、实现方法 (2)五、实验结果 (3)六、源程序清单 (4)一、实验目的1. 了解单链表的结构特点及有关概念;2. 理解单链表的存储结构;3. 掌握单链表的基本操作算法。

二、实验内容建立单链表,完成单链表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、求前驱、求后继、查找元素、判线性表是否为空。

三、实验要点及说明对问题的描述,即对各操作进行详细说明问题描述:编一个程序,作用是建立一个顺序表,且能完成顺序表的如下基本操作:1.建表。

建一个非空的单链表;2.插入。

根据单链表结点的位置在单链表里插入数据;3.查找。

根据顺序表结点的位置查找单链表中的数据;4.删除。

根据单链表结点的位置在单链表里删除数据;5.查找前驱。

按值查找,输出顺序表里的数据的前驱;6.判断线性表是否为空。

判断头结点是否非空即可7.输出。

将顺序表里的数据全部输出;8.求表长。

返回其数据元素个数;9.置空表。

将链表初始化。

10.逆转。

将单链表里的元素逆序。

11.销毁。

释放链表的储存空间。

四、实现方法抽象数据类型的定义:算法分析: 函数名称 功能 InitList初始化链表 AddHead建立链表GetNode查找元素 InsertList 在单链表中插入元素 DeleteList 删除单链表中元素 DestroyList销毁单链表 PriorList 求前驱 ListLength 求表长 ListEmpty判断表是否为空 ClearList 置空表 InversionList逆转PrintList输出表类型 变量或常量typedef struct { DataType*data; int length;int listsize;}SeqList;结构体 变量字符型常量LIST_INIT_SIZE LISTINCREMENT主程序的流程以及各程序模块之间的层次(调用)关系:InsertList 主函数 ClearList DestroyList PrintList InversionList ListEmptyPriorListListLength AddHead GetNode InitList DeleteList五、实验结果六、源程序清单#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define flag 0typedef struct node /*定义结构体类型的结点*/{int data;struct node *next;}LinkList;void InitList(LinkList *&head) /*初始化单链表*/ {head=(LinkList*)malloc(sizeof(LinkList));if(!head)exit(-1);head->next=NULL;}LinkList *AddHead(LinkList *head) /*头插入法建表*/ {LinkList *p;int x;printf(" 请输入元素(输入0结束):");while(x!=flag){p=(LinkList*)malloc(sizeof(LinkList));scanf("%d",&x);if(x!=0){p->data=x;p->next=head->next;head->next=p;}}printf("\t\t创建完成!\n\n");return head;}LinkList *GetNode(LinkList *head,int i) /*定位元素*/ {LinkList *p=head;int j=0;while(p->next&&j<i){j++;p=p->next;}if(j==i)return(p);else return NULL;}void InsertList(LinkList *head,int i,int x) /*插入元素*/ {LinkList *p,*q;p=(LinkList*)malloc(sizeof(LinkList));p->data=x;q=GetNode(head,i-1);p->next=q->next;q->next=p;printf("\t\t插入成功!\n\n");}void DeleteElem(LinkList *head,int i) /*删除元素*/{LinkList *q,*h,*p=head;q=GetNode(p,i-1);h=q->next;q->next=q->next->next;free(h);printf("\t\t删除成功!\n\n");}void DestroyList(LinkList *&head) /*销毁单链表*/ {LinkList *p;while(head){p=head;head=head->next;free(p);}head=NULL;printf("\t\t销毁成功!\n\n");}LinkList *PriorList(LinkList *head,int i) /*求前驱*/{return GetNode(head,i-1);}int ListLength(LinkList *head) /*求表长*/{LinkList *p=head->next;int i;for(i=0;p!=NULL;i++){p=p->next;}return i;}void ListEmpty(LinkList *head) /*判断表是否为空*/ {if(head->next)printf("\t\t表不为空!\n\n");elseprintf("\t\t表为空!\n\n");}LinkList * ClearList(LinkList *head) /*置空表*/{head->next=NULL;printf("\t\t置空成功!\n\n");return head;}void InversionList(LinkList *head) /*逆转*/{LinkList *p,*q,*r;q=head->next->next;head->next->next=NULL;r=head->next;while(q){head->next=q;p=q;q=q->next;p->next=r;r=p;}printf("\t\t已逆转!\n\n");}void PrintList(LinkList *head) /*输出表*/{LinkList *p=head->next;printf("\t\t");while(p){printf("%d ",p->data);p=p->next;}printf("\n\n");}void main(){LinkList *a,*q,*L;int i,x,c;while(1){printf("\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n""\t\t1. 初始化\t\t2. 创建单链表\n""\t\t3. 插入元素\t\t4. 删除元素\n""\t\t5. 逆转\t\t\t6. 输出\n""\t\t7. 求链表长度\t\t8. 查找元素前驱和后继\n ""\t\t9. 查找元素\t\t10. 判断链表是否为空\n ""\t\t11.置空表\t\t12. 销毁\n""\t\t0. 退出\n""\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");printf("\t\t请选择操作序号:");scanf("%d",&c);if(c==0){printf("\n\t\t\t感谢使用!\n\n");break;}switch(c){case 1: InitList(L);printf("\t\t初始化成功!\n\n");break;case 2: AddHead(L);break;case 3:{printf("\t\t请输入插入元素的位置:");scanf("%d",&i);printf("\t\t请输入要插入的元素:");scanf("%d",&x);InsertList(L,i,x);}break;case 4:{printf("\t\t请输入要删除元素的位置:");scanf("%d",&i);DeleteElem(L, i);}break;case 5: InversionList(L);break;case 6: PrintList(L);break;case 7: printf("\t\t表长为:%d\n\n",ListLength(L));break;case 8:{printf("\t\t请输入要求前驱和后继元素的位置:");scanf("%d",&i);a=PriorList(L,i);if(a!=L)printf("\t\t第%d个元素的前驱为%d;",i,a->data);elseprintf("\t\t该位置无前驱!\n\n");if(a->next->next!=NULL)printf("后继为%d\n\n",a->next->next->data);elseprintf("\t\t该位置无后继!\n\n");}break;case 9:{printf("\t\t请输入要查找的位置:");scanf("%d",&x);q=GetNode(L,x);printf("\t\t第%d个位置的元素为:%d\n",x,q->data);}break;case 10:ListEmpty(L);break;case 11:ClearList(L);break;case 12:DestroyList(L);break;}}}七、思考及总结编程方面还是有问题!!!。

相关主题