------ 线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素外,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而头元素没有直接前驱,尾元素没有直接后继。
-------数据结构中常见的线性结构有数组、单链表、双链表、循环链表等。线性表中的元素为某种相同的抽象数据类型。可以是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;
}
这里就与前面的思路一致了。
第一次发文章望大家可以随时提问与反馈,大家共同进步!!!