目录
单链表及其结点
链表是一种数据结构。它是通过动态分配内存、结构体与指针的配合来实现的。
链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,数据域用于数据元素的存储,指针域是指向其他单元的指针。具有一个数据域和多个指针域的存储单元通常称为结点。
此外,链表要有一个指向链表的起始结点的头指针变量head。
在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。因为只有一个指针结点,称为单链表,如图所示:
单链表“结点”结构的一般声明形式:
//单链表“结点”结构声明
typedef struct LinkNode
{
int data;
struct LinkNode* next;
}LinkNode,*LinkList;
单链表的建立
建立单链表,需要一个个地开辟结点和输入各结点数据,并建立起结点之间的联系。建立单链表的步骤:
(1)如果是空链表,即没有信息,要把新建的结点作为链表的第一个结点,也就是让头指针head指向新结点,并让新结点指向空;
(2)如果不是空链表,则将新建结点添加在表尾。
带头结点与不带头结点的单链表创建方式
设置头结点的作用:
通过设置头结点,从而保证处理第一个结点与后面结点的方法一致,首元素也有了前驱结点,更容易对首元素进行操作。需要注意的是头结点中不存放数据。
创建带有头结点的单链表时,要对头结点进行初始化:
//对头结点初始化
head = new student;
head->num = 0;
head->name[0] = '\0';
head->score = 0;
head->next = NULL;
tail = head;//空表时,表头即表尾
单链表的遍历
遍历即利用指针依次将各个结点的数据输出
(1)声明指针p,并指向第一个结点;
(2)当p不为空,重复如下两个操作:输出p所指结点中的元素;指针p后移指向下一个元素。
void Print(LinkList head)
{
LinkList p = head->next;
while (p)
{
printf("%d ", p->date);
p = p->next;
}
}
单链表的插入
先创建一个结点,将其指针域赋为空,然后分情况进行插入:
(1)如果是空链表,让要插入的结点作为第一个结点;
(2)如果不是空链表,让待插入的结点的指针域指向插入点的下一个结点(p->next=pre->next),然后(pre->next=p);
(3)若在表尾插入,让末结点指针指向插入结点。
void link::insert()
{
stuptr p, pre, pnode;
int sno;
cout << "请输入要在哪个学号之后插入学生信息:" << endl;
cin >> sno;
pnode = new student;
cout << "请输入插入学生的信息:" << endl;
cin >> pnode->num;
p = head->next;
pre = head;
while (p != NULL)
{
pre = p;
if (p->num == sno)
{
break;
}
p = p->next;
}
pnode->next = pre->next;
pre->next = pnode;
}
单链表结点的删除
要删除结点p,要先找到前驱结点pre,然后将前驱结点的指针域指向待删除结点的后续结点,然后释放要删除的结点的存储空间。
void list::Delete()
{
int sno;
stuptr p, pre;
cout << "请输入要删除的学号" << endl;
cin >> sno;
pre = head;
p = head->next;
while (p != NULL)
{
if (p->num == sno)
{
pre->next = p->next;
delete[] p;
p = NULL;
cout << "创建成功" << endl;
return;
}
pre = p;
p = p->next;
}
cout << "未找到该结点" << endl;
}
单链表结点的修改
修改过程:先通过遍历找到要修改的结点,然后将新值写到该结点数据域中。
void correct()
{
list * abs = Head;
int number;
cout << "输入查找内容:"<<endl;
cin >> number;
while (abs != NULL)
{
if (abs->number == number)
{
cout << abs->number;
cin >> number;
abs->number = number;
cout << "修改成功" << endl;
}
abs = abs->next;
}
单链表的销毁
当不再使用某个单链表的时候,要把链表进行销毁以减少资源浪费。利用指针变量从头到尾依次指向各个结点,每指向一个结点,就把该结点存储空间释放掉,直到末结点。
void list::destroy()
{
stuptr pl, ptr;
p = head;
while (p != NULL)
{
ptr = p;
p = p->next;
delete[]ptr;
}
head = NULL;
cout << "链表已经销毁" << endl;
}
单链表冒泡排序
void list::sort()
{
stuptr pre, p, q;
stuptr end = NULL;
while (head->next != end)
{
pre = head;
p = head->next;
q = p->next;
while (p->next != NULL)
{
if (p->score > q->score)
{
pre->next = q;
p->next = q->next;
q->next = p;
}
else
{
p = p->next;
}
q = p->next;
pre = pre->next;
}
end = p;
}
}
以上就是c++单链表的相关知识啦,如有不足 敬请指正