做一个豁达而努力的自己。
单链表的定义:单链表连式存储的数据结构,是用任意的存储位置存储数据。
线性表的单链表存储结构:
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; }