线性表的链式表示-----单链表(C++)
编程小白学习了一周数据结构,掌握了单链表的一些基本操作。如初始化、插入、删除、查询等。以下是单链表基本操作的实现。
定义单链表的结构类型
typedef struct LNode {//定义单链表结构类型
ElemType data;//创建数据域
struct LNode* next;//创建指针域
}LNode,*LinkList;
初始化一个单链表,带有头节点
bool InitList(LinkList& L) {
L = new LNode;//分配一个头结点
if (L == NULL) {//内存分配不够
return false;
}
L->next = NULL;//头结点的指针为空
return true;
}
采用头插法建立单链表
LinkList List_HeadInsert(LinkList& L) {
cout << "采用头插法建立单链表" << endl;
int x;
cin >> x;//x表示s->data的值
while (x != 9999) {//当输入9999时,结束创建链表
LNode* s = new LNode;//申请一个结点s
s->data = x;
//将s插入到头结点之后
s->next = L->next;
L->next = s;
cin >> x;
}
return L;
}
采用尾插法建立单链表
LinkList List_TailInsert(LinkList& L) {
cout << "采用尾插法建立单链表" << endl;
LNode* r = L; //申请一个结点r,r当前是头结点
int x = 0;
cin >> x;
while (x != 9999) {//当输入9999时,结束创建链表
LNode* s = new LNode;//给结点s分配新的内存
s->data = x;
r->next = s;
r = s;//将结点r置为尾结点
cin >> x;
}
r->next = NULL;//尾结点置空
return L;
}
按值查找表结点
LNode* LocateElem(LinkList L, ElemType e) {
LNode* p = L->next;
while (p != NULL) {
if (p->data == e) {
return p;
}
else {
p = p->next;
}
}
return NULL;
}
在第i个位置插入元素
bool ListInsert(LinkList& L, int i, ElemType e) {
if (i < 1) {//插入的位置小于1,不合法
return false;
}
LNode* p = L;//申请新的结点p,p当前是头结点
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;//p跳到后一个结点
j++;
}
if (p == NULL) {//i的值大于链表的长度时,结点不存在
return false;
}
LNode* s = new LNode;//申请一个新的结点s
//将结点s插到结点p之后
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
按序号查找结点
LNode* GetElem(LinkList& L, int i) {
if (i < 1) {//序号小于1,不合法
return NULL;
}
int j = 1;
LNode* p = L->next;//申请一个结点p,头指针指向p
while (j < i) {
p = p->next;
j++;
}
if (p == NULL) {//i的值大于链表的长度时,结点不存在
return NULL;
}
return p;
}
按位序删除结点
bool ListDelete(LinkList& L, int i, ElemType e) {
if (i < 1) {
return false;
}
LNode* s = L->next;
int j = 1;
while (j < i - 1) {
s = s->next;
j++;
}
if (s == NULL || s->next == NULL) {
return false;
}
LNode* q = s->next;
e = q->data;
s->next = q->next;
delete q;
return true;
}
求链表长度
int ListLength(LinkList L) {
LNode* s = L;
int i = 0;
while (s->next != NULL) {
s = s->next;
i++;
}
return i;
}
遍历单链表
void Print(LinkList L) {
int i = 1;
LNode* s = L->next;
while (s != NULL) {
cout << s->data << "\t";
s = s->next;
}
cout << endl;
}
写此文章的目的是为了记录自己的学习过程,数据结构尚在初学阶段,代码仅供参考。