数据结构与数据库实验报告张德良电工二.doc
-/实验1 ADT表的编程与实现电工二姓名:张德良学号:201400121076实验目的:加深对抽象数据类型ADT表的理解;实验原理:参照课本p.44-49,及Figure3.6-3.13.实验内容:编写程序实现ADT表的定义,及常用操作:1)、判断表是否为空;源程序#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "malloc.h"/ 定义链表中的节点typedef struct node int member; / 节点中的元素 struct node *pNext; / 指向下一个节点的指针Node,*pNode;/ 函数声明pNode CreateList(); / 创建链表函数void TraverseList(pNode ); / 遍历链表函数bool Is_Empty(pNode); / 判断链表是否为空int main()pNode pHead = NULL; / 定义初始化头节点 struct Node *pHead = NULL int flag; / 存放链表是否为空的标志, int Len; pHead = CreateList(); / 创建一个非循环单链表,并将该链表的头结点的地址付给pHead TraverseList(pHead); / 调用遍历链表函数 if (Is_Empty(pHead) = true) / 判断列表是否为空 return 0; return 0;/ 创建链表函数pNode CreateList() int i; int len; int val; pNode pHead = (pNode)malloc(sizeof(Node); pNode pTail = pHead; pTail->pNext = NULL; printf("请输入节点个数:"); scanf("%d",&len); for(i = 0; i < len; i+) printf("第 %d 个节点的数值:",i+1); scanf("%d",&val); pNode pNew = (pNode)malloc(sizeof(Node); pNew->member = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; return pHead; / 遍历链表函数void TraverseList(pNode pHead) pNode p = pHead->pNext; while(NULL != p) printf("%d ",p->member); p = p->pNext; printf("n"); return ;/ 判断链表是否为空bool Is_Empty(pNode pHead) if (NULL = pHead->pNext) printf ("链表为空!n"); return true; else return false; 运行结果输入节点个数及各节点数值如下2)获取第i个节点的内容源程序#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "malloc.h"#define maxsize 50typedef structint datamaxsize;int last;Sequenlist;Sequenlist * InitList () /创建顺序表Sequenlist * L ;L= (Sequenlist *) malloc( sizeof(Sequenlist) );L->last =0;return(L);Sequenlist * creat() /创建一个有具体内容的顺序表Sequenlist * L; int i=1,n;L=InitList( );printf("请输入数据,以0结束n");scanf("%d",&n);while(n!=0 && L->last<maxsize)L->datai=n;i=i+; L->last+;scanf("%d",&n);return(L);int GetData (Sequenlist * L, int i ) /获取第i个元素if ( i >=1 && i <=L->last)return (L->datai);elseprintf ("参数 i 不合理!n");return 0;void main()int length,i;int value,number,location;int j,k;int flag;Sequenlist * L ;L=creat();printf("Please input the locationn");scanf("%d",&location);value=GetData(L,location);printf("The number is %dn",value);运行程序依次输入链表元素的值,以0结束输入要查找元素的位置3)链表删除元素源程序#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "malloc.h"typedef int ElemType;typedef void Status;typedef struct NodeElemType data;struct Node *next;LNode, *LinkList;Status CreatList(int ,LinkList );Status Traverse(LinkList );Status FreeList(LinkList );ElemType DelElem(LinkList ,ElemType );int main()int Length;ElemType e;LinkList L;L=(LinkList)malloc(sizeof(LNode);L->next=NULL;printf("Input the Length of List:n");scanf("%d",&Length); CreatList(Length,L);printf("Travers the List :n");Traverse(L);while(1)printf("请输入要删除的元素:n");scanf("%d",&e);if(DelElem(L,e)/在L中将元素e删除 printf("删除%d后:n",e);break;printf("未找到该元素,删除失败n");Traverse(L);FreeList(L);printf("List release Success!n");return 0;Status CreatList(int Length,LinkList L)int i;LinkList Body=NULL,p=L;for (i=0;i<Length;i+)Body=(LinkList)malloc(sizeof(LNode);p->next=Body;printf("Input the %dth num:n",i+1);scanf("%d",&(Body->data);p=Body;Body->next=NULL;Status FreeList(LinkList L)LinkList temp=NULL,p=L;while (p)temp=p->next;free(p);p=temp;Status Traverse(LinkList L)LinkList p=L;p=p->next;while(p)/while(p!=NULL)printf("%d ",p->data);p=p->next;printf("n");ElemType DelElem(LinkList L,ElemType e)LinkList p,q;q=p=L;p=p->next;/p指向头结点后第一个元素 while(p)if(p->data=e)q->next=p->next; free(p);return 1; elseq=p;/q始终指向p上一个结点p=p->next;/没有执行上个return,说明没找到 return 0;运行结果:输入节点个数依次输入各个节点的数值输入要删除的元素4)链表插入元素。源程序#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#include "malloc.h"#define N 5typedef int elemtype;typedef struct node elemtype data; struct node *next;linklist;linklist *Creatlist(linklist*L) L=(linklist*)malloc(sizeof(linklist); L->next=NULL; return L; int Judge(linklist *L) if(L->next=NULL) printf("建表成功.n"); else printf("建表失败.n"); return 0;int Input(linklist *L,int x,linklist *r) int i; linklist *p; p=(linklist*)malloc(sizeof(linklist); p->data=x; p->next=NULL; r->next=p; printf("%d ",p->data); return 0;int Insert1(linklist *L,int i) linklist *p,*q,*r,*t; int j=1,item; p=L->next; q=L; r=L; if(L->next=NULL) printf("表空.n"); return 0; else while(p!=NULL&&j<i) q=p; p=p->next; j+; if(p=NULL) printf("%d不在表的范围内.n"); return 0; else t=(linklist*)malloc(sizeof(linklist); t->next=NULL; printf("请输入item:"); scanf("%d",&item); t->data=item; t->next=p; q->next=t; printf("在第%d位上插入值为%d的节点后的所有数据为n",i,item); for(j=0;j<N+1;j+) r=r->next; printf("%d ",r->data); printf("n"); return 1; int main() int i,item,k; linklist *L,*r; printf("单向链表的创建(包括初始化)与输出n"); L=Creatlist(L); Judge(L); printf("表中的数据为:"); r=L; Input(L,5,r); r=r->next; Input(L,32,r); r=r->next; Input(L,67,r); r=r->next; Input(L,56,r); r=r->next; Input(L,9,r); r=r->next; printf("n"); printf("在给定的单链表的第i位上插入值为item的节点n"); printf("请输入i:"); scanf("%d",&i); Insert1(L,i); return 0;运行结果:输入要节点的位置输入要插入节点的数值5)、实验心得:课上讲的ADT表的各种实现通过这次试验使我对课堂知识有了更深刻的理解。