单链表基本概念
单链表是一种单向的线性表,不需要连续的存储空间.插入删除操作不需要移动元素,只需要改变指针.但是访问元素不是随机的,必须从表头开始依次向后搜索.访问时间和访问位置有关.
单链表的实现
基本结构
typedef struct SeqList{
ElemType data;
struct SeqList *next;
int Length;
//Length表是表内元素个数
};
初始化操作
//初始化链表
SeqList* intList(){
SeqList *T;
T = (SeqList*)malloc(sizeof(SeqList)); //*分配内存* //
//设置头指针
T->data =0;
T->Length = 0;
T->next = NULL;
return T;
}
指针变量的好处是可以直接修改内容的值,避免生成多个表的副本.相比我上一篇相比不在需要返回新的线性表,节约了内存消耗.具体可以参见我上一篇动态分配内存顺序表来体会其中区别.
添加元素
//在表尾添加元素e
void listAdd(SeqList *T,ElemType e){
SeqList *p = intList();
T->Length++; //创建内容为e的节点
p->data = e;
SeqList *a = T; //局部指针防止T改变,也可给T加上控制标识实现
//移动到表尾添加e
while(a->next){
a = a->next;
}
a->next = p;
}
插入元素
//插入元素e
void listInsert(SeqList *T,int i,ElemType e){
SeqList *p = intList();
p->data = e; //创建e节点
SeqList *a = T;
int j;
if(i>T->Length){
//在表尾后方插入
while(T->Length<i){
listAdd(T,0);
}
listAdd(T,e);
}else{
//在表位插入
if(i==T->Length){