单链表的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;
}
开发平台: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;
}
相关文章推荐
- 单链表的C语言简单实现
- 单链表顺序存储相关操作的c语言实现
- C语言单链表的建立,查找,添加,删除,修改功能实现
- 单链表的应用:用C语言实现简单的员工管理系统(新建、增、删、改、查、排序)
- (C语言)单链表的链式实现(数据结构二)
- C语言实现单链表的创建和添加结点
- 【C语言】用递归和循环两种方法实现单链表倒置
- C语言实现单链表的生成打印查找删除逆置排序
- C语言实现单链表的简单操作【完整版】
- C语言单链表的实现
- C语言实现单链表面试题(基础篇)
- (线性)单链表的C语言实现--保持有序
- C语言实现单链表的创建、插入、删除
- C语言实现单链表面试题--基础篇
- 数据结构之单链表C语言实现
- 数据结构与算法分析 C语言描述 单链表的实现
- c语言对简单单链表的实现
- C语言实现单链表的逆序打印(带头结点)
- 两个单链表的合并(C语言实现)
- C语言面向对象编程之五:单链表实现