数据结构实验.doc_第1页
数据结构实验.doc_第2页
数据结构实验.doc_第3页
数据结构实验.doc_第4页
数据结构实验.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

建一带头结点的单链表并实现下列运算1.输出所有元素2.查找值为X的元素3.往第i个元素插入元素X4.删除第i个元素#include#include #include /*/* 常量定义 */*/#define ElemType int#define Status int #define TRUE 1#define OK 1#define FALSE 0#define ERROR -1/*/* 线性表的单链表存储结构*/*/typedef struct LNode ElemType data; struct LNode *next;LNode, *LinkList;/ 带有头结点的单链表的基本操作(13个)/*/* 操作结果:构造一个空的线性表L */*/void InitList(LinkList *L) *L = (LinkList)malloc(sizeof(struct LNode); /* 产生头结点,并使L指向此头结点 */ if( !*L ) /* 存储分配失败 */ exit(OVERFLOW); (*L)-next = NULL; /* 指针域为空 */*/* 初始条件:线性表L已存在。*/* 操作结果:销毁线性表L */ /*/void DestroyList(LinkList *L) LinkList q; while(*L) q = (*L)-next; free(*L); *L=q; /*/* 初始条件:线性表L已存在。*/* 操作结果:将L重置为空表 */*/void ClearList(LinkList L) /* 不改变L */ LinkList p, q; p = L-next; /* p指向第一个结点 */ while(p) /* 没到表尾 */ q = p-next; free(p); p = q; L-next = NULL; /* 头结点指针域为空 */*/* 初始条件:线性表L已存在。*/* 操作结果:若L为空表,则返回TRUE,否则返回FALSE */*/Status ListEmpty(LinkList L) /* 非空 */ return (L-next) ? FALSE : TRUE; /*/* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */*/int ListLength(LinkList L) int i = 0; LinkList p = L-next; /* p指向第一个结点 */ while(p) /* 没到表尾 */ i+; p = p-next; return i;/*/* L为带头结点的单链表的头指针。*/* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */*/Status GetElem(LinkList L, int i, ElemType *e) /* 算法2.8 */ int j = 1; /* j为计数器 */ LinkList p = L-next; /* p指向第一个结点 */ while(p & j next; j+; if( !p | j i) /* 第i个元素不存在 */ return ERROR; *e = p-data; /* 取第i个元素 */ return OK;/*/* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)*/* 操作结果: 返回L中第1个与e满足关系compare()的数据元素的位序。 */* 若这样的数据元素不存在,则返回值为0 */*/int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType) int i = 0; LinkList p = L-next; while(p) i+; if(compare(p-data,e) /* 找到这样的数据元素 */ return i; p=p-next; return 0;/*/* 初始条件: 线性表L已存在 */* 操作结果: 若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱 */ /* 返回OK;否则操作失败,pre_e无定义,返回INFEASIBLE */*/Status PriorElem(LinkList L, ElemType cur_e, ElemType *pre_e) LinkList q, p = L-next; /* p指向第一个结点 */ while(p-next) /* p所指结点有后继 */ q = p-next; /* q为p的后继 */ if(q-data = cur_e) *pre_e = p-data; return OK; p = q; /* p向后移 */ return ERROR;/*/* 初始条件:线性表L已存在 */* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继*/* 返回OK; 否则操作失败,next_e无定义,返回INFEASIBLE */*/Status NextElem(LinkList L, ElemType cur_e, ElemType *next_e) LinkList p = L-next; /* p指向第一个结点 */ while(p-next) /* p所指结点有后继 */ if(p-data = cur_e) *next_e = p-next-data; return OK; p = p-next; return ERROR;/*/* 在带头结点的单链线性表L中第i个位置之前插入元素e */*/Status ListInsert(LinkList L, int i, ElemType e) int j = 0; LinkList p = L, s; while( p & j next; j+; if( !p| j i-1) /* i小于1或者大于表长 */ return ERROR; s = (LinkList)malloc(sizeof(struct LNode); /* 生成新结点 */ s-data = e; /* 插入L中 */ s-next = p-next; p-next = s; return OK;/*/* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */*/Status ListDelete(LinkList L, int i, ElemType *e) int j = 0; LinkList p = L, q; while(p-next & j next; j+; if( !p-next | j i-1) /* 删除位置不合理 */ return ERROR; q = p-next; /* 删除并释放结点 */ p-next = q-next; *e = q-data; free(q); return OK;/*/* 初始条件:线性表L已存在。操作结果:依次对L的每个数据元素调用函数vi() */*/void ListTraverse(LinkList L, void(*vi)(ElemType) LinkList p = L-next; while(p) vi(p-data); p = p-next; printf(n);/*/* 初始条件:线性表L已存在。打印链表的data域 */*/void ListPrint(LinkList L) LinkList p = L-next; while(p) printf(%d , p-data); p = p-next; printf(n);void printInt(int data) printf(%d , data);/*/* 插入排序 */*/void ListSort(LinkList L) LinkList first; /*为原链表剩下用于直接插入排序的节点头指针*/ LinkList t; /*临时指针变量:插入节点*/ LinkList p; /*临时指针变量*/ LinkList q; /*临时指针变量*/ first = L-next; /*原链表剩下用于直接插入排序的节点链表*/ L-next = NULL; /*只含有一个节点的链表的有序链表。*/ while (first != NULL) /*遍历剩下无序的链表*/ /*无序节点在有序链表中找插入的位置*/ for (t = first, q = L; (q!=NULL) & (q-data data); p = q, q = q-next); /*退出for循环,就是找到了插入的位置*/ first = first-next; /*无序链表中的节点离开,以便它插入到有序链表中。*/ if (q = L) L = t; /*插在第一个节点之前*/ else p-next = t; /*p是q的前驱*/ t-next = q; /*完成插入动作*/ void main() Lin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论