单链表的基本操作和实现
#include "iostream"
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
typedef string ElemType;
typedef struct LNode{
ElemType elem;
struct LNode* next;
}LNode,*SingleLinkList;
Status LinkList_Init(SingleLinkList& L);
Status LinkList_Destory(SingleLinkList& L);
Status LinkList_Clear(SingleLinkList& L);
int LinkList_GetLength(SingleLinkList L);
int LinkList_IsEmpty(SingleLinkList L);
Status LinkList_Insert(SingleLinkList& L, int i, ElemType e);
Status LinkList_Delete(SingleLinkList& L, int i);
Status LinkList_Ergodic(SingleLinkList L);
Status LinkList_CreateListForHead(SingleLinkList& L, int n);
Status LinkList_CreateListForEnd(SingleLinkList& L, int n);
Status LinkList_GetElem(SingleLinkList L, int i);
int LinkList_LocateElem(SingleLinkList L, ElemType e);
int main() {
SingleLinkList L;
LinkList_Init(L);
int choice;
do
{
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 << "9.获取线性表L中位序为i的结点对应的内容" << endl;
cout << "10.打印单链表" << endl;
cout << "11.在单链表L中查找值为e的数据元素的位置序号" << endl;
cout << "***************************************************" << endl;
cout << "请输入您的选择:" << endl;
cin >> choice;
switch (choice)
{
case 1: {
LinkList_Destory(L);
exit(OK);
break;
}
case 2: {
LinkList_Clear(L);
break;
}
case 3: {
LinkList_IsEmpty(L);
break;
}
case 4: {
int length = 0;
length = LinkList_GetLength(L);
cout << "单链表的表长为:" << length << endl;
break;
}
case 5: {
ElemType e;
int i = 0;
cout << "请输入您要插入的结点的内容:" << endl;
cin >> e;
cout << "请输入您要插入的结点的位序:" << endl;
cin >> i;
LinkList_Insert(L, i, e);
break;
}
case 6: {
int i = 0;
cout << "请输入您要删除的结点的位序:" << endl;
cin >> i;
LinkList_Delete(L, i);
break;
}
case 7: {
int n = 0;
cout << "请输入您要用头插法创建单链表的结点的个数:" << endl;
cin >> n;
LinkList_CreateListForHead(L, n);
break;
}
case 8: {
int n = 0;
cout << "请输入您要用尾插法创建单链表的结点的个数:" << endl;
cin >> n;
LinkList_CreateListForEnd(L, n);
break;
}
case 9: {
int i = 0;
cout << "请输入您要查找的元素的位序:" << endl;
cin >> i;
LinkList_GetElem(L, i);
break;
}
case 10: {
LinkList_Ergodic(L);
break;
}
case 11: {
ElemType e;
int i = 0;
cout << "请输入您要查找的结点的内容:" << endl;
cin >> e;
i = LinkList_LocateElem(L, e);
cout << "数据域为:" << e << "的结点的位序为:" << i << endl;
break;
}
default: {
exit(ERROR);
}
}
} while (1);
system("pause");
return 0;
}
Status LinkList_Init(SingleLinkList& L) {
L = new LNode;
if (L != NULL)
{
L->next = NULL;
cout << "单链表初始化成功" << endl;
return OK;
}
else
{
cerr << "ERROR" << endl;
return ERROR;
}
}
Status LinkList_Destory(SingleLinkList& L) {
LNode* p;
while (L != NULL)
{
p = L;
L = L->next;
delete p;
}
cout << "单链表销毁成功" << endl;
return OK;
}
Status LinkList_Clear(SingleLinkList& L) {
LNode* p, * q;
p = L->next;
while (p != NULL)
{
q = p->next;
delete p;
p = q;
}
L->next = NULL;
cout << "单链表清空成功" << endl;
return OK;
}
int LinkList_GetLength(SingleLinkList L) {
SingleLinkList p;
p = L->next;
int i = 0;
while (p != NULL)
{
i++;
p = p->next;
}
return i;
}
int LinkList_IsEmpty(SingleLinkList L) {
if (L->next != NULL)
{
cout << "单链表不为空" << endl;
return 0;
}
else {
cout << "单链表为空" << endl;
return 1;
}
}
Status LinkList_Insert(SingleLinkList& L, int i, ElemType e) {
SingleLinkList p;
p = L;
int j = 0;
while ((p != NULL) && (j < i - 1))
{
p = p->next;
j++;
}
if ((p == NULL) || (j > i - 1))
{
cout << "单链表插入失败" << endl;
return ERROR;
}
LNode* s = new LNode;
s->elem = e;
s->next = p->next;
p->next = s;
cout << "单链表插入成功" << endl;
return OK;
}
Status LinkList_Delete(SingleLinkList& L, int i) {
SingleLinkList p;
p = L;
int j = 0;
while ((p->next != NULL) && (j < i - 1))
{
p = p->next;
++j;
}
if ((p->next == NULL) || (j > i - 1)) {
cout << "单链表删除失败" << endl;
return ERROR;
}
SingleLinkList q = p->next;
p->next = q->next;
delete q;
cout << "单链表删除成功" << endl;
return OK;
}
Status LinkList_Ergodic(SingleLinkList L) {
SingleLinkList p;
p = L->next;
cout << "**************************" << endl;
while (p != NULL)
{
cout << p->elem << " ";
p = p->next;
}
cout << endl;
cout << "**************************" << endl;
return OK;
}
Status LinkList_CreateListForHead(SingleLinkList& L, int n) {
L = new LNode;
L->next = NULL;
for (int i = n; i > 0; --i)
{
LNode* p = new LNode;
cout << "请输入头插法要插入的值:" << endl;
cin >> p->elem;
p->next = L->next;
L->next = p;
}
cout << "头插法建立单链表成功" << endl;
return OK;
}
Status LinkList_CreateListForEnd(SingleLinkList& L, int n) {
L = new LNode;
L->next = NULL;
SingleLinkList r;
r = L;
for (int i = 0; i < n; i++)
{
LNode* p = new LNode;
cout << "请输入尾插法要插入的值:" << endl;
cin >> p->elem;
p->next = NULL;
r->next = p;
r = p;
}
cout << "尾插法建立单链表成功" << endl;
return OK;
}
Status LinkList_GetElem(SingleLinkList L, int i) {
SingleLinkList p;
p = L->next;
int j = 1;
while ((p != NULL) && (j < i))
{
p = p->next;
++j;
}
if ((p == NULL) && (j > i))
{
cout << "查找失败" << endl;
return ERROR;
}
ElemType e = p->elem;
cout << "查找成功" << endl;
cout << "查找到的数据元素的值为:" << e << endl;
return OK;
}
int LinkList_LocateElem(SingleLinkList L, ElemType e) {
SingleLinkList p;
p = L->next;
int j = 1;
while ((p != NULL) && (p->elem != e))
{
p = p->next;
j++;
}
if (p != NULL)
{
cout << "查找成功" << endl;
return j;
}
else {
cout << "查找失败" << endl;
return 0;
}
}