单链表
一个单向链表基本由两个元素组成,即数据字段和指针,而指针通常指向下一个节点内存所在的地址。
最后一个节点没有其他节点可以连接,因此指针的值为NULL。

class List{
public:
int data;
class List *next;
}
创建与遍历
以动态分配产生链表节点的方式,可以先行定义一个类数据类型,要有一个数据字段,接着在类中定义一个指针变量,其数据类型与此类相同,作用是指向下一链表节点。
遍历单向链表的过程,就是使用指针运算来访问链表中的每一个节点,为了便于操作可以定义一个指针变量作为链表的读取游标。
创建链表有两种方法,头插法和尾插法,下面分别介绍。
头插法
每次在链表的头部插入,即插入位置是phead的下一个,若想将pnewnode插入,首先将pnewnode的指针域指向phead->next,再将phead的指针域指向pnewnode

使用头插法创建单链表
Linklist Creat_list(Linklist head) {
head = (Linklist)malloc(sizeof(Lnode)); // 为头指针开辟内存空间
Lnode *node = NULL; // 定义新结点
int count = 0; // 创建结点的个数
head->next = NULL;
node = head->next; // 将最后一个结点的指针域永远保持为NULL
printf("Input the node number: ");
scanf("%d", &count);
for (int i = 0; i < count; i++) {
node = (Linklist)malloc(sizeof(Lnode)); // 为新结点开辟内存空间
node->data = i; // 为新结点的数据域赋值
node->next = head->next; // 将头指针所指向的下一个结点的地址,赋给新创建结点的next
head->next = node; // 将新创建的结点的地址赋给头指针的下一个结点
}
return head;
}
尾插法
每次在尾部插入,就是最后一个节点的后面插入,首先需要遍历单链表,找到最后一个节点。将最后一个节点的指针域指向pnewnode,再将pnewnode的指针域指向null

使用尾插法创建单链表
创建第一个节点head后,head->next赋值为NULL。此时这个节点既是头结点,又是尾节点。因此将头结点head的地址赋值给尾结点end。然后创建第二个节点,让当前尾节点的指针域指向新节点,再将新节点变成尾结点。end->next=node;end=node;
相当于不断插入新节点,将当前的尾结点的指针域指向新节点,再将新节点变为尾结点。这一过程中,尾结点的位置是不断向后动态移动的。当不再有新节点插入时,将尾结点的指针域指向NULL
Linklist Creat_list(Linklist head) {
head = (Linklist)malloc(sizeof(Lnode)); // 为头指针开辟内存空间
Linklist node = NULL; // 定义结点
Linklist end = NULL; // 定义尾结点
head->next = NULL; // 初始化头结点指向的下一个地址为 NULL
end = head; // 未创建其余结点之前,只有一个头结点
int count = 0 ; // 结点个数
printf("Input node number: ");
scanf("%d", &count);
for (int i = 0; i < count; i++) {
node = (Linklist)malloc(sizeof(Lnode)); // 为新结点开辟新内存
node->data = i; // 新结点的数据域赋值
end->next = node;
end = node;
}
end->next = NULL;
}
完整代码
#include<iostream>
using namespace std;
class list { //定义链表结构
public:
int data;
class list* next;
};
typedef class list node;
typedef node* link;
int main() {
link newnode, head, phead; //声明三个链表结构的指针
int n;
cout << "请输入将要存储的元素个数: " << endl;
cin >> n;
phead = new node; //phead暂当链表头指针
if (!phead) { //分配内存失败时phead=NULL
cout << "[Error!内存分配失败!]" << endl;
}
cout << "请依次输入存储元素: " << endl;
cin >> phead->data; //输入节点的数据
head = phead; //保留链表头指针,以phead为指向当前节点的指针
for (int i = 0; i < n - 1; i++) {
newnode = new node;
if (!newnode) {
cout << "[Error!内存分配失败!]" << endl;
}
cin >> newnode->data;
newnode->next = NULL;
phead->next = newnode; //把新节点加在链表后面
phead = newnode; //让phead保持在链表的最后面
}
cout << "输出数据: " << endl;
phead = head; //让phead回到链表头
while (phead != NULL) {
cout << phead->data << "->";
head = phead;
phead = phead->next; //phead按序往后遍历整个链表
if (!phead) cout << "NULL" << endl;
delete head; //释放内存空间
}
return 0;
}
3462

被折叠的 条评论
为什么被折叠?



