您的位置:首页 > 编程语言 > C语言/C++

单链表的C语言实现

2009-09-25 09:10 405 查看
名称:单链表的结构定义和基本操作

开发平台:Windows 7 Ultimate RC

开发环境:Visual Studio 2008 SP1

作者:毛晋

完成日期:2009年9月24日

//c_lib.h

Code:

#include "stdio.h"

#include "stdlib.h"

#include "time.h"

//cpp_lib.h

Code:

#include "iostream"

using namespace std;

//LinkList.h

Code:

#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

Code:

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: