线性表-单链表的基本操作

#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);
}

运行结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不被定义的~wolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值