@说明:
本代码对应《数据结构(C语言版)严蔚敏》第二章第三节中抽象数据类型线性链表的实现。
本代码分为三个文件:LinkList.h定义着线性链表抽象数据对象与基本操作;LinkList.cpp是对LinkList.h头文件中基本操作的具体实现;TestMain.cpp是一部分对线性链表实现过程的测试。
1:LinkList.h文件
#include<stdio.h>
#define MAXSIZE 20
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;//定义元素的类型
typedef struct LNode {
ElemType data;
struct LNode *next;
}LNode,LinkList;
//初始化一个空的线性表,使其长度为0
Status InitLinkList(LinkList *L);
//销毁线性表
Status DestroyLinkList(LinkList *L);
//添加一个元素e到线性表中
Status AddElem(LinkList *L, ElemType e);
//重置线性表,使其长度为0,data从新分配内存
Status ClearList(LinkList *L);
//返回线性表的长度
Status ListLength(LinkList L);
//返回当前位子元素
Status GetElem(LinkList L, int index, ElemType &e);
//归并两个线性表
Status MargeList(LinkList *La, LinkList *Lb, LinkList &Lc);
//定位元素所在位子//该节中未实现
Status Compare(ElemType e, ElemType data);
Status LocationElem(LinkList *L, ElemType e, Status(Compare)(ElemType, ElemType));
//在index上插入一个e
Status Insert(LinkList *L, int index, ElemType e);
//在index上删除一个e
Status Delete(LinkList *L, int index, ElemType &del_e);
//定义一个打印函数
void PrintElem(ElemType e);
//使线性表中的每个元素通过PrintElem函数打印出来
Status LinkListTraverse(LinkList *L, void(Visit)(ElemType));
2:LinkList.cpp
#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#include"LinkList.h"
Status InitLinkList(LinkList *L) {
if (L == NULL) {
printf("111111111111");
L = (LinkList *)malloc(sizeof(LinkList));
}
if (L == NULL) {
printf("内存分配失败!");
return FALSE;
}
else {
L->data = NULL;
L->next = NULL;
LinkList *p, *q=L;
int x;
printf("输入你要添加结点的个数:");
scanf_s("%d", &x);
while (x > 0) {
p = (LinkList *)malloc(sizeof(LinkList));
printf("请输入链表结点的值!\n");
scanf_s("%d", &p->data);
while (q->next != NULL) {
q = q->next;
}
p->next = q->next;
q->next = p;
x--;
}
return TRUE;
}
}
Status DestroyLinkList(LinkList *L) {
if (L != NULL) {
LinkList *p,*q;
for (p = L->next; p != NULL; p = q) {
q = p->next;
free(p);
}
L->next = NULL;
return TRUE;
}
return FALSE;
}
Status AddElem(LinkList *L, ElemType e) {
if (L != NULL) {
LinkList *p = L;
while (p->next != NULL) {
p = p->next;
}
LinkList* e_Node = (LNode *)malloc(sizeof(LNode));//声请一个节点空间
e_Node->data = e;
e_Node->next = NULL;
p->next = e_Node;
return TRUE;
}
return FALSE;
}
Status ClearList(LinkList *L) {
if (L == NULL) {
printf("The list is empty, no need to clear.\n");
return 0;
}
LinkList *p = L->next, *q = NULL;
while (p != NULL)
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;
free(q);
printf("The list is cleared.\n");
return TRUE;
}
Status ListLength(LinkList L) {
LinkList *p = L.next;
int length = 0;
while (p != NULL) {
p = p->next;
length++;
}
return length;
}
Status GetElem(LinkList L, int index, ElemType &e) {
LinkList *p = L.next;
int j = 0;
while (p != NULL && j < index) {
p = p->next;
j++;
}
if (p == NULL || j > index) return FALSE;
e = p->data;
return TRUE;
}
Status MargeList(LinkList *La, LinkList *Lb, LinkList &Lc) {
LinkList *pa = La->next,*pb = Lb->next, *pc=&Lc;
while (pa && pb) {
if (pa->data <= pb->data) {
pc->next = pa;
pc = pa;
pa = pa->next;
}
else {
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
return TRUE;
}
Status Insert(LinkList *L, int index, ElemType e) {
LinkList *p = L;
int j = 0;
while (p != NULL && j < index-1) {
p = p->next;
j++;
}
if (p==NULL && j > index) return FALSE;
LNode *e_Elen = (LNode *)malloc(sizeof(LNode));
e_Elen->data = e;
e_Elen->next = p->next;
p->next = e_Elen;
return TRUE;
}
Status Delete(LinkList *L, int index, ElemType &del_e) {
LinkList *p = L->next, *preNode = L;
printf("L->next = %d \n",L->next->data);
int n = 1;
while (p != NULL && n < index) {
preNode = p;
p = p->next;
n++;
}
if (p == NULL || n > index) return FALSE;
del_e = p->data;
preNode->next = p->next;
free(p);
return TRUE;
}
//定义一个打印一个数值的函数
void PrintElem(ElemType e)
{
printf("%d ", e);
}
void PrintElem(char e[10])
{
printf("%s ", e);
}
//使线性表中的每个元素通过PrintElem函数打印出来
Status LinkListTraverse(LinkList *L, void(Visit)(ElemType)) {
if (L != NULL) {
LinkList *p;
for (p = L->next; p != NULL; p = p->next)
//调用打印函数
Visit(p->data);
printf("\n");
return TRUE;
}
return FALSE;
}
3:TestMain.cpp
#include<stdio.h>
#include<string.h>
#include"LinkList.h"
int main() {
LinkList La;
InitLinkList(&La);
LinkListTraverse(&La, PrintElem);
LinkList Lb;
InitLinkList(&Lb);
LinkListTraverse(&Lb, PrintElem);
LinkList Lc;
MargeList(&La, &Lb, Lc);
LinkListTraverse(&Lc, PrintElem);
//ClearList(&L);//清空表
//LinkListTraverse(&Lb, PrintElem);
ElemType d;
// GetElem(L, 3, d);
// PrintElem(d);
Insert(&L, 6, 9);
LinkListTraverse(&L, PrintElem);
printf("长度%d\n", ListLength(L));
printf("删除第6的值");
Delete(&L, 1, d);
PrintElem(d);
DestroyLinkList(&L);
LinkListTraverse(&L, PrintElem);
return 0;
}
4:结果