单链表的基本操作详解
单链表的创建、插入、删除、修改、查找等基本操作
单链表的结点上存储数据data和下个结点的地址——后继指针next,所以可以定义一个结构体存储这两个元素:
//结点结构体
typedef struct Node {
int data;
struct Node* next;
}Node;
创建结点:
Node* CreateNode(int data)//创建结点
{
Node* node = (Node*)malloc(sizeof(Node));//申请内存
node->data = data;
node->next = NULL;
return node;
}
创建单链表
步骤:首先需要创建一个头结点,然后头结点指向一个新结点,新的结点又指向一个新结点,我们可以通过循环来创建一个指定长度的单链表,如下所示:
Node* CreatList(int num)//创建长度为num的单链表
{
Node* head = CreateNode(NULL);//创建头结点
Node* temp = head;//初始化tmp指针指向头结点,表示头结点
for (int i = 0; i < num;i++)
{
Node* node = CreateNode(i);//创建新结点
temp->next = node;//头结点的下一个结点等于新结点
temp = node;//tmp指针指向新结点
}return head;
}
获取链表的长度:
int ListLen(Node* head)//链表长度
{
int len = 0;
while (head)
{
head = head->next;
len++;
}
return len;
}
插入结点:
Node* ListInsert(Node* head, int locate, int data)//在链表指定位置插入一个结点 返回头结点
{
if (!head || locate > ListLen(head) || locate < 0)//判断链表是否为空以及插入的位置是否超出链表的范围
{ cout << "不符合规范,重新输入" << endl;
}
else if (locate == 0) //插入0位置,即插入一个头结点
{
Node* node = CreateNode(data);
node->next = head;//新结点的下一个结点等于头结点
head = node;//头结点等于新结点
}
else {
Node* temp=head;
for (int i = 0;i < locate - 1;i++)
{
temp = temp->next;
}
Node* node = CreateNode(data);
node->next = temp->next;
temp->next = node;
}
return head;
}
删除节点:
void ListDelete(Node* head, int locate, int e)//删除指定位置的一个结点
{
if (!head || locate<0 || locate>ListLen(head))//判断链表是否为空以及插入的位置是否超出链表的范围
{
cout << "输入删除位置有误" << endl;
}
else if (locate == 0)
{
Node* temp = head;
head = temp->next;//头结点等于头结点的下一个结点
free(temp);//释放删除结点的内存
temp = NULL;
}
else {
Node* node = head;
for (int i = 0;i < locate - 1;i++)
{
node = node->next;
}
Node* tmp = node->next;
node->next = tmp->next;
free(tmp);//释放删除结点的内存
tmp = NULL;
}
}
主程序:
#include<iostream>//ZJJ数据据结构-单链表2.8-2.9
using namespace std;
//结点结构体
typedef struct Node {
int data;
struct Node* next;
}Node;
Node* CreateNode(int data)//创建结点
{
Node* node = (Node*)malloc(sizeof(Node));//申请内存
node->data = data;
node->next = NULL;
return node;
}
Node* CreatList(int num)//创建长度为num的单链表
{
Node* head = CreateNode(NULL);//创建头结点
Node* temp = head;//初始化tmp指针指向头结点,表示头结点
for (int i = 0; i < num;i++)
{
Node* node = CreateNode(i);//创建新结点
temp->next = node;//头结点的下一个结点等于新结点
temp = node;//tmp指针指向新结点
}return head;
}
int ListLen(Node* head)//链表长度
{
int len = 0;
while (head)
{
head = head->next;
len++;
}
return len;
}
void ListShow(Node* head)//输出链表
{
while (head)
{
cout << head->data << " ";
head = head->next;
}
cout << endl;
}
int ElemGet(Node*head, int i, int &e){
Node* p = head;
p=head->next;
int j = 1;
while (p && j < i)
{
p = p->next;
j++;
}
if (!p || j > i) {
cout << "不存在" << endl;
}
e = p->data;
return e;
}
Node* ListInsert(Node* head, int locate, int data)//在链表指定位置插入一个结点 返回头结点
{
if (!head || locate > ListLen(head) || locate < 0)//判断链表是否为空以及插入的位置是否超出链表的范围
{ cout << "不符合规范,重新输入" << endl;
}
else if (locate == 0) //插入0位置,即插入一个头结点
{
Node* node = CreateNode(data);
node->next = head;//新结点的下一个结点等于头结点
head = node;//头结点等于新结点
}
else {
Node* temp=head;
for (int i = 0;i < locate - 1;i++)
{
temp = temp->next;
}
Node* node = CreateNode(data);
node->next = temp->next;
temp->next = node;
}
return head;
}
void ListDelete(Node* head, int locate, int e)//删除指定位置的一个结点
{
if (!head || locate<0 || locate>ListLen(head))//判断链表是否为空以及插入的位置是否超出链表的范围
{
cout << "输入删除位置有误" << endl;
}
else if (locate == 0)
{
Node* temp = head;
head = temp->next;//头结点等于头结点的下一个结点
free(temp);//释放删除结点的内存
temp = NULL;
}
else {
Node* node = head;
for (int i = 0;i < locate - 1;i++)
{
node = node->next;
}
Node* tmp = node->next;
node->next = tmp->next;
free(tmp);//释放删除结点的内存
tmp = NULL;
}
}
int main()
{
int num = 6;
Node *head=CreatList(num);
ListShow(head);
ListInsert(head,3, 666);
ListShow(head);
}
有无欠缺的,欢迎指正。