声明
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
不能保证到其他编译器下能成功运行。