单链表是数据结构的基础,主要是在考研数据结构的复习中,把代码敲一遍,顺一下,总结一下单链表的几种最基本的操作。
尾插法创建链表
通过尾插法进行创建单链表,主要是要注意内存分配,查看内存是否能够分配成功,创建时利用头结点进行创建,然后通过添加普通的结点,加入链表,并添加指针,逐渐进行移动,形成一条单链表,最后结点的next要设为空。
LinkList Creat_Till_List()
{
int n;
cout<<"Please input how much node you want to creat:"<<endl;
cin>>n;
LNode *r;
//分配头结点内存
Head=(LNode *)malloc(sizeof(LNode));/*头结点*/
if(Head==NULL)
{
cout<<"malloc failed"<<endl;
exit(1);
}
r=Head;
//根据输入的个数来进行尾插法,创建链表
for(int i=0;i<n;i++)
{
cout<<"Please input the "<<i+1<<" node;"<<endl;
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
cout<<"malloc failed"<<endl;
exit(1);
}
//尾插法具体实现步骤
//输入结点的值
cin>>p->data;
//将新建结点链到链表里面
r->next=p;
//挪动指针的位置
r=p;
}
//最后一位的next置为空
r->next=NULL;
return Head;
}
遍历单链表,并统计结点个数
主要是设置指针,并且逐渐向后移动,达到遍历的效果,并设置元素,进行统计结点个数。
LNode *Get_LNode(LinkList Head)
{
LNode *t;
t=Head->next;
int num=0;
//向后移动遍历链表
while(t!=NULL)
{
cout<<t->data<<endl;
t=t->next;
num++;
}
cout<<"The numeber of Link is "<<num<<endl;
}
删除单链表内的结点
首先输入想要删除的元素的序号,然后通过遍历的方式,也就是向后移动指针,来找到要删除节点的前驱节点,然后跳过要删除的结点,再释放掉就可以了。
LNode *Del_Node(LinkList Head)
{
int j=0;
cout<<"input the number you want to delete"<<endl;
int num;
cin>>num;
LNode *p;
p=Head;
//寻找到要删除的元素 找到前驱节点p
while(p->next && j<num-1)
{
p=p->next;
j++;
}
//确定删除位置正确
if(!(p->next)||(j>num-1))
{
exit(1);
}
//删除结点,其实是跳过结点
LNode *q;
q=p->next;
p->next=q->next;
int e=q->data;
cout<<"delete is "<<e<<endl;
free(q);
return Head;
}
向链表内插入结点
插入结点时注意要找到合适的位置,和删除略有区别,插入可以插到第一个的前面,也可以插入最后,注意找到合适的位置。
LNode *List_Insert(LinkList Head)
{
int j=0;
cout<<"input the number you want to insert"<<endl;
int num;
cin>>num;
LNode *p;
p=Head;
//插入可以向最后一个的后面插入也可以插入头结点的后面,注意和删除的区别
while(p && j<num-1)
{
p=p->next;
j++;
}
//保证插入位置正确
if(!(p)||(j>num-1))
{
exit(1);
}
LNode *s;
//分配插入结点的内存
s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
{
cout<<"malloc failed"<<endl;
exit(1);
}
//将结点插入链表
cin>>s->data;
s->next=p->next;
p->next=s;
cout<<"the node you input is "<<s->data<<endl;
return Head;
}
将链表逆置
链表逆置采用的是头插法进行逆置,先要解放出头结点,然后进行循环插入,把所有的结点都插入头结点后面,首元结点的前面
LNode *Back_Link(LinkList L)
{
LNode *p, *q;
//p指针记录首元结点的位置
p = L->next;
//先把头结点释放出来
L->next = NULL;
while (p != NULL)
{
//将p指针的值给q指针
q = p;
//p指针向后移动一位
p = p->next;
//将q指针指向的结点插入首元结点前面
q->next = L->next;
// 将头结点和q指向的结点连起来
L->next = q;
}
return L;
}
单链表操作整体代码
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode, *LinkList;
LNode *p;
LinkList Head;
LinkList Creat_Till_List()
{
int n;
cout<<"Please input how much node you want to creat:"<<endl;
cin>>n;
LNode *r;
//分配头结点内存
Head=(LNode *)malloc(sizeof(LNode));/*头结点*/
if(Head==NULL)
{
cout<<"malloc failed"<<endl;
exit(1);
}
r=Head;
//根据输入的个数来进行尾插法,创建链表
for(int i=0;i<n;i++)
{
cout<<"Please input the "<<i+1<<" node;"<<endl;
p=(LNode *)malloc(sizeof(LNode));
if(p==NULL)
{
cout<<"malloc failed"<<endl;
exit(1);
}
//尾插法具体实现步骤
//输入结点的值
cin>>p->data;
//将新建结点链到链表里面
r->next=p;
//挪动指针的位置
r=p;
}
//最后一位的next置为空
r->next=NULL;
return Head;
}
LNode *Get_LNode(LinkList Head)
{
LNode *t;
t=Head->next;
int num=0;
//向后移动遍历链表
while(t!=NULL)
{
cout<<t->data<<endl;
t=t->next;
num++;
}
cout<<"The numeber of Link is "<<num<<endl;
}
LNode *Del_Node(LinkList Head)
{
int j=0;
cout<<"input the number you want to delete"<<endl;
int num;
cin>>num;
LNode *p;
p=Head;
//寻找到要删除的元素
while(p->next && j<num-1)
{
p=p->next;
j++;
}
//确定删除位置正确
if(!(p->next)||(j>num-1))
{
exit(1);
}
//删除结点,其实是跳过结点
LNode *q;
q=p->next;
p->next=q->next;
int e=q->data;
cout<<"delete is "<<e<<endl;
free(q);
return Head;
}
LNode *List_Insert(LinkList Head)
{
int j=0;
cout<<"input the number you want to insert"<<endl;
int num;
cin>>num;
LNode *p;
p=Head;
//插入可以向最后一个的后面插入也可以插入头结点的后面,注意和删除的区别
while(p && j<num-1)
{
p=p->next;
j++;
}
//保证插入位置正确
if(!(p)||(j>num-1))
{
exit(1);
}
LNode *s;
//分配插入结点的内存
s=(LNode *)malloc(sizeof(LNode));
if(s==NULL)
{
cout<<"malloc failed"<<endl;
exit(1);
}
//将结点插入链表
cin>>s->data;
s->next=p->next;
p->next=s;
cout<<"the node you input is "<<s->data<<endl;
return Head;
}
LNode *Back_Link(LinkList L)
{
LNode *p, *q;
//p指针记录首元结点的位置
p = L->next;
//先把头结点释放出来
L->next = NULL;
while (p != NULL)
{
//将p指针的值给q指针
q = p;
//p指针向后移动一位
p = p->next;
//将q指针指向的结点插入首元结点前面
q->next = L->next;
// 将头结点和q指向的结点连起来
L->next = q;
}
return L;
}
int main()
{
Head=Creat_Till_List();
Get_LNode(Head);
Head=Del_Node(Head);
Get_LNode(Head);
Head=List_Insert(Head);
Get_LNode(Head);
Head=Back_Link(Head);
Get_LNode(Head);
return 0;
}