数据结构1、线性表---链式存储之单链表

数据结构1、线性表---链式存储之单链表

      • 一,线性表简介
      • 二,单链表的实现

一,线性表简介

------ 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素外,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而头元素没有直接前驱,尾元素没有直接后继。

-------数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种相同的抽象数据类型。可以是C语言的内置类型或结构体,也可以是C++自定义类型。

二,单链表的实现

-------所谓单链表就是在一个链表节点中只有一个指针域,并且这个指针域用来存储下一个节点的地址,区别于循环链表,单链表只能从头访问到最后,而不能再从最后节点返回到头节点。

-------前期的准备,为了方便以后修改类型在这里统一重定义一下

# include "stdio.h"
# include "iostream"
# define  list_length 100
# define add_list 10
# define  ok 1
# define  error 0
typedef int status;
using namespace std;

------建立一个节点结构体,并且重定义结构体的指针类型

typedef struct LNode{
	status data;		//节点的数据域
	struct LNode * next;		//节点的指针域
}*TNode;

------初始化链表

int InitChainList( TNode&L) {
	L  = (LNode *)malloc(sizeof(LNode));
	if (!L)
		exit(OVERFLOW);
	L->data = 0;
	L->next = NULL;
	return ok;
}

这是肯定会有童鞋好奇这里为什么不用new,当然可以用new,但是笔者只是单纯的向复习下malloc,哈哈要体谅,顺带与大家一起复习一下malloc/free、new/delete的区别:
其实在使用的大部分情况下,两者是可以通用的,但是我们还是要知道他两的区别。

1、malloc与free是c++/c语言的标准函数,new/delete是C++的运算符。

2、他们都可用于申请动态内存和释放内存。new/delete,其实底层也是执行的malloc/free。但是new/delete更加智能,因为new和delete在对象创建的时候自动执行构造函数,对象消亡之前会自动执行析构函数。

3、new返回指定类型的指针,并且可以自动计算出所需要的大小。如 :

int *p = new int; //返回类型为int*类型,大小为sizeof(int);

而malloc必须用户指定大小,并且默然返回类型为void*,必须强行转换为实际类型的指针。

int *p = (int*)malloc(sizeof(int));//返回类型为void*,必须强行转换为实际类型的指针,而且还得计算大小

------增加节点

int addChainList(TNode &L,status elem) {
	TNode p = (LNode*)malloc(sizeof(LNode));
	if (!p)
		exit(OVERFLOW);
	TNode q=L;
	while (q->next){
		q = q->next;
	}
	q->next = p;
	p->data = elem;
	p->next = NULL;
	return ok;
}

在这里增加节点的时候必须先遍历链表到最后一个节点,再将申请好的节点接在最后一个节点的next域。

------删除节点

int deleChainList(TNode &L, int index,status&s) {
	TNode p = L->next;
	int i = 0;
	while (p&&index>=0) {
		if (i==index-1){
			TNode q = p->next;
			p->next = q->next;
			s = q->data;
			free(q);
		}
		p = p->next;
		i++;
	}
	return ok;
}

在这里删除下标为index的元素,先找到index的前一个元素,然后将index的后继元素赋值给index的前驱,即实现index前驱与后继的连接,并且用一个临时节点q指向index节点,然后free(q),并且将删除元素的值赋值给s;

-------访问下标为index的元素

int ChainListEleAt(TNode L,int index,status&s) {
	TNode p = L;
	int i = 0;
	while (p->next) {
		p = p->next;
		if (i==index){
			s = p->data;
			break;
		}
		i++;
	}
	return ok;
}

这里就与前面的思路一致了。

第一次发文章望大家可以随时提问与反馈,大家共同进步!!!

你可能感兴趣的:(数据结构,单链表,c/c++)