数据结构(C语言版)严蔚敏——2.3线性链表类型定义

@说明:

本代码对应《数据结构(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:结果

在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值