单链表的基本操作
//节点的定义
typedef struct LINKNODE
{
int info; //存储信息
struct LINKNODE * next;
}LinkNode;
//链表的定义
class LinkList
{
private:
LinkNode *head;
int size;
public:
LinkList(); //构造函数
~LinkList(); //析构函数
void *init(); //链表初始化
void Insert(LinkList *list, int pos, int data); //插入
void first(LinkList *list); //返回第1个节点
void del(LinkList *list, int pos); //删除
int Find(LinkList *list, int data); //查找
int length(LinkList *list); //长度
void print(LinkList *list); //打印
int InsertPrint();
int DelPrint();
int FourteenPrint();
int FiftyPrint();
};
LinkList::LinkList() {} //构造函数
LinkList::~LinkList() //析构函数(销毁链表)
{
LinkNode *P = head;
while (head)
{
P = head;
head = head->next;
delete(P);
}
}
void *LinkList::init() //链表初始化
{
LinkList *list = (LinkList*)malloc(sizeof(LinkList)); //申请链表内存
list->size = 0;
list->head = (LinkNode*)malloc(sizeof(LinkNode)); //申请节点内存
list->head->info = NULL;
list->head->next = NULL;
return list;
}
void LinkList::Insert(LinkList *list, int pos, int data) //插入(pos是位置)
{
if (list == NULL)
{
return;
}
if (data == NULL)
{
return;
}
if (pos < 0 || pos > list->size) //pos位置越界的时候,把节点从尾部插入
{
pos = list->size;
}
LinkNode *NewNode = (LinkNode*)malloc(sizeof(LinkNode)); //创建新的节点
NewNode->info = data;
NewNode->next = NULL;
LinkNode *pCurrent = list->head;
for (int i = 0; i < pos; i++) //根据pos找出插入节点的位置 ( i 是数位置,i 根据pos数值对应next指针)
{
pCurrent = pCurrent->next; //移动节点
}
NewNode->next = pCurrent->next; //新节点插入链表
pCurrent->next = NewNode; //将NewNode本身的地址赋给pCurrent指向的下一个地址
list->size++; //链表的长度增加
}
void LinkList::first(LinkList *list) //返回第一个节点
{
cout << "节点第一:" << list->head->next->info << endl << endl;
return;
}
void LinkList::del(LinkList *list, int pos) //删除(pos是位置)
{
if (list == NULL)
{
return;
}
if (pos < 0 || pos >= list->size)
{
return;
}
LinkNode *pCurrent = list->head;
for (int i = 0; i < pos; i++) //根据pos查找删除节点的地址
{
pCurrent = pCurrent->next;
}
LinkNode *pDel = pCurrent->next;
pCurrent->next = pDel->next; //删除节点后,把后面的节点接上去
delete(pDel);
list->size--;
}
int LinkList::Find(LinkList *list, int data) //查找
{
if (list == NULL)
{
return -1;
}
if (data == NULL)
{
return -1;
}
LinkNode *pCurrent = list->head->next; //遍历查找从头指针开始
int i = 0;
while (pCurrent != NULL) //遍历查找
{
if (pCurrent->info == data)
{
break;
}
i++;
pCurrent = pCurrent->next;
}
if (i < list->size)
{
cout << "查找成功!节点的位置是“ " << i << " ” " << endl << endl;
}
else
{
cout << "查找失败!节点不存在。" << endl << endl;
}
return i;
}
int LinkList::length(LinkList *list) //长度
{
cout << "链表长度:" << list->size << endl << endl;
return -1;
}
void LinkList::print(LinkList *list) //打印
{
if (list == NULL)
{
return;
}
LinkNode * pCurrent = list->head->next;
cout << "链表打印:";
while (pCurrent != NULL)
{
cout << pCurrent->info << " ";
pCurrent = pCurrent->next;
}
cout << endl << endl; //换行
}
int LinkList::InsertPrint() //打印节点插入的提示信息
{
cout << "节点插入:" << "1 2 3 4 5 6" << endl << endl;
return 0;
}
int LinkList::DelPrint() //打印节点删除的提示信息
{
cout << "节点删除:6" << endl << endl;
return 0;
}
int LinkList::FourPrint() //打印4节点查找的提示信息
{
cout << "节点查找:“ 4 ”" << endl << endl;
return 0;
}
int LinkList::TenPrint() //打印10节点查找的提示信息
{
cout << "节点查找:“ 10 ”" << endl << endl;
return 0;
#include <iostream>
using namespace std;
void main()
{
LinkList L; //实例化
LinkList *list = (LinkList*)L.init();
L.InsertPrint(); //打印节点插入的提示信息
L.Insert(list, 0, 1); //根据0、1、2、3、4、5的位置插入节点
L.Insert(list, 1, 2);
L.Insert(list, 2, 3);
L.Insert(list, 3, 4);
L.Insert(list, 4, 5);
L.Insert(list, 5, 6);
L.first(list); //返回第一个节点
L.DelPrint(); //打印节点删除的提示信息
L.del(list, 5); //删除位置为“ 5 ”的节点“ 6 ”
L.FourPrint(); //打印4节点查找的提示信息
L.Find(list, 4); //查找(成功)
L.TenPrint(); //打印10节点查找的提示信息
L.Find(list, 10); //查找(失败)
L.length(list); //长度
L.print(list); //打印
}