#include<bits/stdc++.h>
using namespace std;
typedef int Sb;
//结构体构造单链表结构
typedef struct Node{
int data; //数据域
struct Node *next; //指针域。指向下一节点
}LinkList;
//初始化,创建头节点
LinkList *StList(LinkList *L)
{
L = (LinkList *)malloc(sizeof(LinkList)); //为头节点分配空间
L->next = NULL; //头节点指针域置空
return L;
}
//创建指定个数的单链表
LinkList *CreateList(int len)
{
Sb e;
cout << "创建元素的个数:";
cin >> len;
cout <<"请输入"<<len<<"个你要放入的元素:";
LinkList *L = StList(L),*r,*n; //分别定义头指针、尾指针和新指针
r = L; //尾指针初始化为头指针
for(int i = 0;i < len;i++)
{
cin >> e;
n = (LinkList *)malloc(sizeof(LinkList)); //为新节点分配空间
n->data = e;
n->next = NULL; //新节点指针域置空
r->next = n; //将新指针加入单链表末尾
r = r->next; //尾指针往后移
}
return L;
}
//打印单链表
void PrintLinkList(LinkList *L)
{
LinkList *p;
p = L->next;
cout << "当前单链表的元素有:";
while(p)
{
cout << p->data;
p = p->next;
cout <<" ";
}
cout<<endl;
}
//求链表长度
int GetLen(LinkList *L)
{
int len;
if(L->next == NULL) //判断头指针是否为空
return 0;
LinkList *r = L->next;
while(r)
{
r = r->next; //尾指针后移
len++;
}
return len;
}
//将元素插入指定位置
int InsertLinkList(LinkList *L)
{
int p,e;
cout <<"输入插入元素的位置和值:";
cin >>p>>e;
if(p < 1 || p > GetLen(L)+1) //判断下标是否越界
return 0;
LinkList *r = L,*n;
n = (LinkList *)malloc(sizeof(LinkList));
n->data = e;
n->next = NULL;
while(--p>0) //要自减一下,有点数组那味道
{
r = r->next; //将尾指针后移一位
}
n->next = r->next; //先把新指针链入尾指针后一个节点
r->next = n; //再把新指针链入尾指针之后,顺序一定不能搞反,不然造成数据丢失
return 1;
}
//将指定位置元素删除
int DeleteLinkList(LinkList *L)
{
int p,*e;
cout <<"输入要删除元素的位置和值:";
cin >>p>>*e;
if(p < 1 || p > GetLen(L)+1) //判断下标是否越界
return 0;
LinkList *r = L,*d;
while(--p > 0)
{
r = r->next; //将尾指针移到删除位置
}
d = r->next; //删除元素节点
*e = d->data; //保存删除元素的值
r->next = d->next; //将尾指针跳过删除节点链入下一个节点
free(d); //释放删除节点空间
return 1;
}
//头插法,核心代码L->next = NULL; p->next = L->next; L->next = p;
void TouLinkList(LinkList *L)
{
cout<<"头插后:";
LinkList *r,*p,*q; // 尾指针(紧贴头指针)、欲插入指针、遍历指针
r = L->next;
p = q = r->next;
r->next = NULL;
while(q!=NULL)
{
q = q->next; //遍历指针后移
p->next = r;
L->next = p;
r = p;
p = q; //欲插入指针与遍历指针同步
}
}
//尾插法,核心代码r = L; p->next = NULL; r->next = p; r = p;
void WeiLinkList(LinkList *L)
{
cout<<"尾插后:";
LinkList *r,*p,*q; //尾指针、欲插入指针、遍历指针
r = L->next;
p = q = r->next;
p->next = NULL;
while(q!=NULL)
{
q = q->next;
r->next = p;
r = p;
p = q; //欲插入指针与遍历指针同步
}
}
//主函数
int main()
{
Sb len;
LinkList *L;
L = CreateList(len);
PrintLinkList(L);
InsertLinkList(L);
PrintLinkList(L);
DeleteLinkList(L);
PrintLinkList(L);
TouLinkList(L);
PrintLinkList(L);
WeiLinkList(L);
PrintLinkList(L);
}
运行结果: