【代码】单链表操作——增删改查、反序输出、反转链表

声明
linklist.h

#pragma once
#include<iostream>
using namespace std;

//链表节点信息
struct Info {
	int data;
	Info *next;

	Info ():data(NULL),next(NULL){
	}
	Info(int num):data(num),next(NULL){}
};
typedef struct Info * Link;


void CreatLink(int, Link);   //创建链表,带头结点
int IsNull(Link);    //判断链表是否为空
void Insert(Link, Info *, int);   //再p结点后插入数据
Link RevervalLink(Link);   //反转链表
void Delete1(int, Link);    //删除某个位置结点
void Delete2(int, Link);    //删除某个数据
void SelectInfo(Link, int);  //查找某结点所在位置
void UpdataInfo(Link, int, int);  //修改某位置数据
void Sort(Link);     //升序排序
int Length(Link);   //求链表长度
Link BeforInfo(Link, Info *);   //求某结点的前驱结点
void Display(Link);      //顺序输出链表 
void Display2(Link);    //逆序输出链表

linklist.cpp

#include"linklist.h"

//创建链表 或插入链表尾部
void CreatLink(int num, Link head)
{
	Link plist = head;
	while (plist->next != NULL) { plist = plist->next; }
	Info * next1 = new Info(num);
	plist->next = next1;
}

//插入链表,在p结点后插入数据
void Insert(Link head, Info*  pinfo,int data)
{
	Link plist = head->next;
	while (plist != NULL)   
	{
		if (plist == pinfo)     
		{
			Info * tinfo = new Info(data);
			tinfo->next = pinfo->next;
			pinfo->next = tinfo;
			break;
		}
		plist = plist->next;
	}
}


//反转链表
//需要三个结点--前驱结点,当前结点,后续结点
Link RevervalLink(Link head)
{
	Info * tinfo , *binfo = head->next;
	Link plist = binfo->next;
	if (IsNull(head)) return NULL;
	binfo->next = NULL;     //第一个结点反转后会变为最后一个结点
	while (plist != NULL){
		tinfo = plist->next;
		plist ->next= binfo;
		binfo = plist;
		plist = tinfo;
	} 
	//plist为空跳出循环,此时反转的最后一个结点为binfo
	head->next = binfo;     
	return head;
}


//判断链表是否为空,为空返回1
//因为带了头结点,头结点不为空
int IsNull(Link head)
{
	return (head->next == NULL);
}


//输出
void Display(Link head)
{
	Info * plist = head->next;
	while (plist != NULL) {
		cout << plist->data << " ";
		plist = plist->next;
	}
	cout << endl;
}

//逆序输出链表
//递归
void Display2(Link head)
{
	Info * plist = head;
	if (plist == NULL) return;
	Display2(plist->next);
	cout << plist->data << "  ";
}

//前驱节点
Link BeforInfo(Link head, Info * pInfo)
{
	Link plist = head;
	if (plist->next == NULL) return NULL;
	while (plist->next != NULL)
	{
		if (plist->next == pInfo)
			return plist;
		plist = plist->next;
	}
}

//删除节点(第几个),不算头结点
/*这里以寻找前驱节点的方式*/
void Delete1(int i, Link head)
{
	Link plist = head->next;
	if (IsNull(head))	return; 
	if (i == 1) { head->next = plist->next; delete plist; }
	if (Length(head) < i) { cout << "删除位置超过链表长度"; return; }
	int k = 1;
	while (plist != NULL && k <= i) {
		if (k++ == i) {
			Link tlist = BeforInfo(head, plist);
			tlist->next = plist->next;
			delete plist;
			break;
		}
		plist = plist->next;
	}
}


//删除指定值的节点
/*这里以交换数据的方式*/
void Delete2(int data, Link head)
{
	bool flag = false;
	if (IsNull(head)) return;
	Link plist = head->next;
	while (plist != NULL)
	{
		if (plist->data == data)
		{
			Link tlist = plist->next;
			plist->next = plist->next->next;
			plist->data = tlist->data;
			delete tlist;
			//break;           //只删除第一个出现的节点就在此加上break;
			flag = true;
		}
		plist = plist->next;
	}
	if (!flag) cout << "无查找数据" << endl;
}

//求单链表的长度 加上头结点
int Length(Link head)
{
	Link plist = head;
	int Len = 0;
	while (plist != NULL)
	{
		Len += 1;
		plist = plist->next;
	}
	return Len;
}

//排序链表
/*冒泡排序*/
void Sort(Link head)
{
	if (IsNull(head)) return;
	Link plist;
	int tdata;     //中间变量,节点数据信息
	int Len = Length(head);
	for (int i = 1; i < Len - 1; i++)
	{
		plist = head->next;
		while (plist != NULL && plist->next != NULL)
		{
			if (plist->data > plist->next->data)
			{
				tdata = plist->data;
				plist->data = plist->next->data;
				plist->next->data = tdata;
			}
			plist = plist->next;
		}
	}
}


//求某元素所在位置(全部位置)
void SelectInfo(Link head, int data)
{
	Info * plist = head->next;
	int i = 0;
	bool flag = false;
	cout << data << "在链表中的位置为:";
	while (plist != NULL)
	{
		i += 1;
		if (plist->data == data)
		{
			cout << " " << i << "  ";
			flag = true;
		}
		plist = plist->next;
	}
	if (!flag) cout << "无查找数据" << endl;
}

//修改某位置结点数据为num
void UpdataInfo(Link head, int site, int data)
{
	if (site >= Length(head)) 
	{
		cout << "欲修改位置超出链表长度" << endl;
		return;
	}
	Link plist = head->next;
	int flag = 1;
	while (plist != NULL)
	{
		if (flag == site) {
			plist->data = data;
			return;
		}
		flag += 1;
		plist = plist->next;
	}
}

这是我做测试写的主函数,有需求自行修改。
源.cpp

#include"linklist.h"

/*带头结点的链表操作*/
int main()
{
	Link headlist = new Info;    //创建头结点 ,头结点不存储数据
	int num[] = {40,3,9,5,6,70,5,6,8,6,23 };
	for (int i = 0; i < (sizeof(num) / sizeof(num[0])); i++)
		CreatLink(num[i], headlist);
	Display(headlist);
//	Delete1(3,headlist);
//	Delete2(6, headlist);
	Sort(headlist);
	Display(headlist);
	Link plist = RevervalLink(headlist);
	Display(plist);
	SelectInfo(plist, 6);
	cout << endl;
	UpdataInfo(plist, 2, 50);
	Display(plist);
	system("pause");
	return 0;
}

代码记录一下,仅供参考,铁憨憨不要直接复制,有问题欢迎讨论。
编译器:VS 2017
不能保证到其他编译器下能成功运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值