在设计链表的各种运算之前,最重要的准备工作是定义链式存储(即链表)的结点类型,最简单的单链表的结点类型可由数据域data和指针域next两部分组成。然后再分别设计各种运算的具体函数。最后在主函数中实现链表的各种运算时,分别调用相应的函数即可。
新建一个“Win32 Console Application”工程,创建头文件global.h
#include <stdio.h> // NULL, printf()等
#include <malloc.h> // malloc()等
#include <string.h>
// 函数结果状态定义
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status; // 函数返回类型(表示结果状态,如OK等)
创建头文件linklist.h
typedef char* ElemType;
typedef struct node {
ElemType data; //数据域
struct node *next; //指针域
}LNode, *LinkList; //定义单链表的结点结构、单链表类型指针
LinkList InitList(void);
Status DestoryList(LinkList &L);
Status ListInsert(LinkList &L,int i,ElemType e);
Status ListDelete(LinkList &L,int i,ElemType &e);
int ListLength(LinkList L);
Status GetElem(LinkList L,int i,ElemType &e);
int LocateElem(LinkList L,ElemType e);
Status PrintList(LinkList L);
创建一个“C++ Source File”文件linklist.cpp
#include "global.h"
#include "linklist.h"
// 操作结果:构造一个空链表 L
LinkList InitList(void) {
LinkList L;
L=(LinkList)malloc(sizeof(LNode));//表头结点
if(!L) return NULL; // 存储分配失败
L->next=NULL; // 空表
return L;
}
// 初始条件:链表 L 已存在。操作结果:销毁链表 L
Status DestoryList(LinkList &L) {
LinkList q;
while ( L ) {//从表头结点开始释放
q=L->next;//预先前行到下一结点
free(L);
L=q;//工作指针跟踪下一结点
}
return OK;
}
// 操作结果:在L中第i个位置之前插入新的数据元素e