数据结构-线性表的链式存储
2017-09-24 20:05
239 查看
目标效果:
老师发的框架,让自己填写基本的删除插入方法,我依然简化了部分代码,为了以后查看方便。
linkList.h:
dsp0202.cpp:
源码下载:点击打开链接
老师发的框架,让自己填写基本的删除插入方法,我依然简化了部分代码,为了以后查看方便。
linkList.h:
#ifndef LINKLIST_H_INCLUDED #define LINKLIST_H_INCLUDED #ifndef ElemType #define ElemType int /* 数据元素类型默认为 int */ #define ELEMTYPE_TAG #endif /********************************************************** * 单链表的存储结构定义 ***********************************************************/ typedef struct LNode { ElemType data; struct LNode *next; } LNode, *LinkList; /********************************************************** * 单链表的基本操作声明 ***********************************************************/ //创建并初始化为空表 bool InitList(LinkList &L); //销毁整个表(从此之后不再可用) bool DestroyList(LinkList &L); //将表L置空 bool ClearList(LinkList &L); //判断表L是否为空表 bool ListEmpty(LinkList L); //求表L的长度 int ListLength(LinkList L); //取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR void GetElem(LinkList L, int i, ElemType &e); template <typename T> bool equal(T a, T b) { return a==b; } int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)=equal<ElemType>); //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR bool ListInsert(LinkList &L, int i, ElemType e); //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR bool ListDelete(LinkList &L, int i, ElemType &e); //遍历表L,对每个元素调用visit(x). bool ListTraverse(LinkList L, bool (*visit)(ElemType)); /********************************************************** * 单链表的基本操作的实现 ***********************************************************/ //创建并初始化为空表 bool InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode)); L->next=NULL; if(!L) return false; return true; } //判断表L是否为空表 bool ListEmpty(LinkList L) { if(L) return false; return true; } //求表L的长度 int ListLength(LinkList L) { LinkList p; p=L; int j=0; while(p->next) { p=p->next; j++; } return j; } //在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0 int LocateElem(LinkList L, ElemType e, bool (*compare)(ElemType,ElemType)) { LinkList p; int j; p = L; j = 0; while(p!=NULL) { if(p->data==e ) return j; p=p->next; j++; } return 0; } //在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR bool ListInsert(LinkList &L, int i, ElemType e) { if(i<1||i>ListLength(L)+1) return false; LinkList p,s; p=L; s=(LinkList)malloc(sizeof(LNode)); int j=0; s->data=e; while(j<i-1) { p=p->next; j++; } s->next=p->next; p->next=s; return true; //------------------------------------- } //删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR bool ListDelete(LinkList &L, int i, ElemType &e) { if(i<1||i>ListLength(L)) return false; LinkList p; p=L; int j=0; while(j<i-1) { p=p->next; j++; } e=p->data; p->next=p->next->next; return true; //------------------------------------- } //遍历表L,对每个元素调用visit(x). bool ListTraverse(LinkList L, bool (*visit)(ElemType)) { LinkList p = L->next; while ( p ) { if ( visit(p->data)==false ) return false; p = p->next; } return true; } #ifdef ELEMTYPE_TAG #undef ElemType #undef ELEMTYPE_TAG #endif #endif // LINKLIST_H_INCLUDED
dsp0202.cpp:
#include <stdio.h> #include <stdlib.h> #define ElemType int //数据元素的类型 bool equal(ElemType a, ElemType b); //比较两个元素相等的方法 #include "linklist.h" //打印链表内容 void PrintLinkList(LinkList L); int main() { LinkList L; //1)初始化链表 InitList(L); //2)插入一些元素: 12,23,34,45 ListInsert(L,1,12); ListInsert(L,1,23); ListInsert(L,1,34); ListInsert(L,1,45); //3)打印链表信息 printf("\n开始时链表内容\n"); PrintLinkList(L); printf("ListLength(L) : %d\n", ListLength(L)); printf("ListEmpty(L) : %d\n", ListEmpty(L)); //4)链表插入 printf("\n请输入一个元素:"); ElemType x; scanf("%d",&x); printf("插入开头:"); ListInsert(L,1,x); PrintLinkList(L); printf("插入末尾:"); ListInsert(L,ListLength(L)+1,x); PrintLinkList(L); //5)链表删除 printf("\n请选择删除第i(1..%d)个元素:", ListLength(L)); int i; scanf("%d",&i); ElemType e; if ( ListDelete(L,i,e)==true ) { bool print(ElemType e); //声明print(e)函数 printf("删除"); print(e); printf("成功\n"); } else printf("删除失败.\n"); printf("链表内容:"); PrintLinkList(L); //6)元素定位 printf("\n请输入一个元素以便定位:"); scanf("%d",&x); i = LocateElem(L,x); if ( i!=0 ) { printf("该元素是表中的第%d个元素.\n",i); } else printf("该元素在表中不存在.\n"); printf("\n最后链表内容\n"); PrintLinkList(L); printf("ListLength(L) : %d\n", ListLength(L)); printf("ListEmpty(L) : %d\n", ListEmpty(L)); system("PAUSE"); return 0; } // 打印数据元素的方法 bool print(ElemType e) { printf("%5d",e); return true; } //比较两个元素相等的方法 bool equal(ElemType a, ElemType b) { return a==b; } //打印链表内容 void PrintLinkList(LinkList L) { ListTraverse(L,print); //遍历链表并print()每个元素 printf("\n"); }
源码下载:点击打开链接
相关文章推荐
- 数据结构一一线性表的链式存储结构之删除操作
- C语言数据结构-2.线性表之链式存储结构
- 数据结构啊----线性表的链式存储
- <<C#版数据结构>>之--线性表的链式存储(单链表)
- 数据结构:线性表的链式存储(双向链表)--Java实现
- 数据结构之线性表链式存储(链表)
- 数据结构复习——线性表的链式存储实现(单向链表)
- 数据结构一一线性表的链式存储结构之查找操作
- 数据结构:线性表的链式存储结构_单链表
- 数据结构:线性表的链式存储(单向链表)--Java实现
- 数据结构复习——线性表的链式存储实现(双向链表)
- 数据结构——线性表之链式存储
- 数据结构:线性表之链式存储结构
- 2015年考研核心考点命题思路解密——数据结构 第二章 线性表 考点3 线性表的链式存储(选择题部分)
- 艾伟_转载:C#版数据结构之--线性表的链式存储(单链表)
- 数据结构一一线性表的链式存储结构之头插法和尾插法建立链表
- 数据结构之线性表代码实现顺序存储,链式存储,静态链表(选自大话数据结构)
- 数据结构--链式存储线性表(LinkedList)
- JAVA数据结构 线性表的链式存储及其实现
- 数据结构一一线性表的链式存储结构之整表删除