名称:单链表的结构定义和基本操作
开发平台:Windows 7 Ultimate RC
开发环境:Visual Studio 2008 SP1
作者:毛晋
完成日期:2009年9月24日
//c_lib.h
- #include "stdio.h"
- #include "stdlib.h"
- #include "time.h"
//cpp_lib.h
- #include "iostream"
- using namespace std;
//LinkList.h
- #include "windows.h"
- //定义函数结果状态代码
- #define TRUE 1
- #define ERROR 0
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -1
- #define UNDERFLOW -2
- //定义单链表的数据元素的类型
- typedef INT ElemType;
- //定义函数返回值的数据类型
- typedef INT Status;
- //定义单链表的存储结构
- #pragma once
- typedef struct LNode{
- ElemType data;
- struct LNode *next;
- }LNode,*LinkList;
- //声明相关的辅助函数
- Status compare(ElemType,ElemType);
- Status output(LNode);
- //声明函数指针
- typedef Status (*pCompare)(ElemType,ElemType);
- typedef Status (*pOutput)(LNode);
- //声明单链表的基本操作
- Status InitList(LinkList&);
- Status DestroyList(LinkList);
- Status ClearList(LinkList);
- Status ListEmpty(LinkList);
- LONG ListLength(LinkList);
- Status GetElem(LinkList,LONG,ElemType&);
- Status LocateElem(LinkList,ElemType,LONG&,pCompare);
- Status PriorElem(LinkList,ElemType,ElemType&);
- Status NextElem(LinkList,ElemType,ElemType&);
- Status ListInsert(LinkList,LONG,ElemType);
- Status ListDelete(LinkList,LONG,ElemType&);
- Status ListTraverse(LinkList,pOutput);
LinkList.cpp
- #include "stdafx.h"
- #include "cpp_lib.h"
- #include "LinkList.h"
- Status compare(ElemType e1,ElemType e2)
- //操作结果:比较e1和e2是否相等,若相等,返回TRUE;否则,返回FALSE
- {
- if(e1==e2)
- return TRUE;
- else
- return FALSE;
- }
- Status output(LNode node)
- //操作结果:将node的数据域在屏幕上输出
- {
- if(node.next != NULL)
- cout<<(node.data)<<"-->";
- else
- cout<<(node.data)<<endl;
- return OK;
- }
- Status InitList(LinkList &L)
- //操作结果:构造一个空的线性表L
- {
- L=(LinkList)malloc(sizeof(LNode));
- if(L==NULL){
- cout<<"头结点的存储空间分配失败"<<endl;
- return ERROR;
- }
- L->next=NULL;
- return OK;
- }
- Status DestroyList(LinkList L)
- //初始条件:线性表L已存在
- //操作结果:销毁线性表
- {
- LinkList p=L;
- while(L!=NULL){
- p=L->next;
- free(L);
- L=p;
- }
- return OK;
- }
- Status ClearList(LinkList L)
- //初始条件:线性表L已存在
- //操作结果:将L置为空表
- {
- LinkList p=L->next;
- L->next=NULL;
- LinkList q=p;
- while(p!=NULL){
- q=p->next;
- free(p);
- p=q;
- }
- return OK;
- }
- Status ListEmpty(LinkList L)
- //初始条件:线性表L已存在
- //操作结果:若L为空表,则返回TRUE;否则,返回FALSE
- {
- if(L->next == NULL)
- return TRUE;
- else
- return FALSE;
- }
- LONG ListLength(LinkList L)
- //初始条件:线性表L已存在
- //操作结果:返回L中数据元素的个数
- {
- LinkList p=L->next;
- LONG i=0;
- while(p!=NULL){
- i++;
- p=p->next;
- }
- return i;
- }
- Status GetElem(LinkList L,LONG index,ElemType &e)
- //初始条件:线性表L已存在,1<=index<=ListLength(L)
- //操作结果:用e返回L中第i个数据元素的值
- {
- LONG i=0;
- LinkList p=L;
- for(;(i<index) && (p!=NULL);i++,p=p->next)
- ;
- if((i>index) || (p==NULL))
- return ERROR;
- else{
- e=p->data;
- return OK;
- }
- }
- Status LocateElem(LinkList L,ElemType e,LONG &pos,pCompare comFun)
- //初始条件:线性表L已存在,comFun是指向compare()函数的指针
- //操作结果:返回L中第1个与e满足关系compare()的数据元素的位置。若这样的数据元素
- //不存在,返回ERROR
- {
- LinkList p=L;
- LONG i=0;
- while((p != NULL) && (comFun(p->data,e) == FALSE)){
- p=p->next;
- i++;
- }
- if(p!=NULL){
- pos=i;
- return OK;
- }
- else{
- cout<<"未查找到该元素"<<endl;
- return ERROR;
- }
- }
- Status PriorElem(LinkList L,ElemType e,ElemType &preElem)
- //初始条件:线性表L已存在
- //操作结果:若e是L的数据元素,且不是第一个,则用preElem返回它的前驱,否则,操作失败。
- {
- LONG i;
- LocateElem(L,e,i,compare);
- if(i == 1){
- cout<<e<<"不存在前驱结点"<<endl;
- return ERROR;
- }
- else{
- GetElem(L,i-1,preElem);
- return OK;
- }
- }
- Status NextElem(LinkList L,ElemType e,ElemType &nextElem)
- //初始条件:线性表L已存在
- //操作结果:若e是L的数据元素,且不是最后一个,则用nextElem返回它的后继,否则,操作失败
- {
- LONG i;
- LocateElem(L,e,i,compare);
- if(i == ListLength(L)){
- cout<<e<<"不存在后继结点"<<endl;
- return ERROR;
- }
- else{
- GetElem(L,i+1,nextElem);
- return OK;
- }
- }
- Status ListInsert(LinkList L,LONG index,ElemType e)
- //初始条件:线性表L已存在,1<=i<=ListLength(L)+1
- //操作结果:在L中的第i个元素之前插入新的数据元素e,L的长度加1
- {
- if((index<1) || (index>ListLength(L)+1)){
- cout<<"插入元素的位序不合理"<<endl;
- return ERROR;
- }
- LONG i=0;
- LinkList p=L;
- while((i<index-1) && (p!=NULL)){
- i++;
- p=p->next;
- }
- if((i>index-1) || (p == NULL))
- return ERROR;
- LNode *q=(LNode*)malloc(sizeof(LNode));
- if(q == NULL){
- cout<<"结点存储空间分配失败"<<endl<<"插入结点失败"<<endl;
- return ERROR;
- }
- q->next=p->next;
- p->next=q;
- q->data=e;
- return OK;
- }
- Status ListDelete(LinkList L,LONG index,ElemType &e)
- //初始条件:线性表L已存在且非空,1<=i<=ListLength(L)
- //操作结果:删除L的第i个元素,并用e返回其值,L的长度减1
- {
- if((index<1) || (index>ListLength(L))){
- cout<<"删除的位序不合理"<<endl;
- return ERROR;
- }
- LONG i=1;
- LinkList p=L->next;
- while((i<index-1) && (p!=NULL)){
- i++;
- p=p->next;
- }
- if((i>index) || (p == NULL))
- return ERROR;
- LNode *q=p->next;
- p->next=q->next;
- e=q->data;
- free(q);
- return OK;
- }
- Status ListTraverse(LinkList L,pOutput outFun)
- //初始条件:线性表L已存在
- //操作结果:依次对L的每个数据元素调用函数output()
- {
- LinkList p=L->next;
- if(p != NULL){
- outFun(*p);
- ListTraverse(p,outFun);
- return OK;
- }
- else
- return OK;
- }