做一个豁达而努力的自己。
单链表的定义:单链表连式存储的数据结构,是用任意的存储位置存储数据。
线性表的单链表存储结构:
typedef struct Node
{
ElemType data;
struct Node *next;
}Node, *LinkList;
无论链表是否为空,头指针均不为空,头指针是链表的必要元素。
生成头指针:LinkList head;
头结点可以不存储数据,同时它可以存储链表的长度等信息,但不是链表的必要元素。
生成头结点:L = new Node;
#include <iostream>
#include <cstdlib>
using namespace std;
//单链表结构的定义
typedef struct Node
{
int data;
struct Node *next;
}*LinkList;
//单链表的初始化
bool InitList(LinkList &L)
{
L = new Node; //生成头节点,头指针指向头结点
if(!L)
return false;
L->next = NULL;
return true;
}
//单链表的创建(头插法,输入顺序与输出顺序相反)
void CreateList_H(LinkList &L)
{
int n;
LinkList s; //s为存放新节点的指针
cout << "输入要存放的数据元素个数:";
cin >> n;
while(n--)
{
s = new Node;
cout << "输入int型数据:";
cin >> s->data;
s->next = L->next; //新节点指向头结点指向的节点
L->next = s; //头结点指向新节点
}
}
//单链表的创建(尾插法)
void CreateList_T(LinkList &L)
{
int n;
LinkList s, r; //s为存放新节点的指针,r存放尾指针
r = L; //尾指针指向头结点
cout << "输入要存放的数据元素个数:";
cin >> n;
while(n--)
{
s = new Node;
cout << "输入int型数据:";
cin >> s->data;
s->next = NULL;
r->next = s;
r = s;
}
}
//单链表的查找
bool GetList(LinkList L, int i, int &e)
{
int j = 1;
LinkList p;
p = L->next;
while(p && j < i)
{
p = p->next;
j++;
}
if(!p || j > i)
return false;
e = p->data;
return true;
}
//单链表的插入
bool InsertList(LinkList &L, int i, int e)
{
int j = 1;
LinkList s, p;
p = L;
while(p && j < i) //循环到i-1的数据节点
{
p = p->next;
j++;
}
if(!p || j > i)
return false;
s = new Node;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//单链表的删除
bool DeleteList(LinkList &L, int i)
{
int j = 1;
LinkList p,q;
p = L;
while(p->next && j < i)
{
p = p->next;
j++;
}
if(!(p->next) || j > i)
return false;
q = p->next;
p->next = q->next;
delete q;
return true;
}
//单链表的销毁
void DestroyList(LinkList &L)
{
LinkList p, q;
p = L->next;
while(p)
{
q = p->next;
delete p;
p = q;
}
L->next = NULL; //头指针指针域为空
}
//单链表的输出
void PutList(LinkList L)
{
cout << "元素数据:" << endl;
LinkList p;
p = L->next;
while(p)
{
cout << p->data << endl;
p = p->next;
}
}
//菜单
void menu()
{
cout << "1.单链表的初始化" << endl;
cout << "2.单链表的头插发创建" << endl;
cout << "3.单链表的尾插法创建" << endl;
cout << "4.单链表的查找" << endl;
cout << "5.单链表的插入" << endl;
cout << "6.单链表的删除" << endl;
cout << "7.单链表的销毁" << endl;
cout << "8.单链表的输出" << endl;
cout << "0.退出单链表" << endl;
}
int main()
{
LinkList head; //生成头指针,存放的是头结点或首元结点的指针
int e, i;
bool n;
int num = -1;
while(num != 0)
{
system("cls");
menu();
cout << "请选选项:";
cin >> num;
switch(num)
{
case 1: n = InitList(head);
if(n == 0)
cout << "初始化失败" << endl;
else
cout << "初始化成功" << endl;
break;
case 2: CreateList_H(head);
cout << "头插法创建成功" << endl;
break;
case 3: CreateList_T(head);
cout << "尾指针创建成功" << endl;
break;
case 4: cout << "请输入要查找的位置:";
cin >> i;
n = GetList(head, i, e);
if(n == 0)
cout << "查找失败" << endl;
else
{
cout << "查找结果:";
cout << e << endl;
}
break;
case 5: cout << "请输入要插入的位置:";
cin >> i;
cout << "请输入int型数据:";
cin >> e;
n = InsertList(head, i, e);
if(n == 0)
cout << "插入失败" << endl;
else
cout << "插入成功" << endl;
break;
case 6: cout << "请输入删除位置:";
cin >> i;
n = DeleteList(head, i);
if(n == 0)
cout << "删除失败" << endl;
else
cout << "删除成功" << endl;
break;
case 7: DestroyList(head);
break;
case 8: PutList(head);
break;
case 0: break;
default : "没有输入选项";
}
system("pause");
}
return 0;
}