前言:本文是在lady_killer9的博客_CSDN博客-网络安全,python,常见算法与数据结构实现领域博主做出相应的修改,完善了部分代码,有不足之处欢迎指正
#includeusing namespace std; #define Status int #define ElemType int typedef struct LNode { ElemType data;//数据域 struct LNode* next;//指针域 }LNode, * linkList; Status InitList(linkList& L) { L = new LNode; L->next = NULL; return 1; } //头插法创建 void CreateList_H(linkList& L) { int i, n,x; LNode* temp; cout << "请输入链表的结点个数:"; cin >> n; L = new LNode; L->next = NULL; for (i = n; i >= 1; i--) { cout << endl << "--------请输入第" << i << "个节点的数据:" ; cin >> x; temp = new LNode; temp->data = x; temp->next = L->next; L->next = temp; } } //尾插法创建 void CreateList_R(linkList& L) { int i, n,x; cout << "请输入链表的结点个数:"; cin >> n; L = new LNode; L->next = NULL; LNode* temp, * r; r = L; for (i = 1; i <= n; i++) { cout << endl << "--------请输入第"<> x; temp->data = x; temp->next = r->next; r->next = temp; r = temp; } } int ListLength(linkList L) { linkList p = L; int sum = 0; while (p) { sum++; p = p->next; } return sum - 1;//不含头结点 } //插入 bool ListInsert(linkList& L, int i, ElemType e) { LNode* s; linkList p = L; int j = 0; while (p && (j < i - 1))//j指到i-1位置或者p已经到最后时跳出 { p = p->next; ++j; } if (!p || j > i - 1)//i<1或者i>ListLength(L)+1时,插入位置无效 不调用ListLength,提高效率 { cout << "插入的位置无效!!!" << endl; return false; } s = new LNode; s->data = e; s->next = p->next; p->next = s; return true; } bool ListDelete(linkList& L, int i) { LNode* p, * q; p = L; int j = 0; while ((p->next)&& (j < i - 1))//j指到i-1位置 { p = p->next; ++j; } if (!(p->next) || (j > i - 1))//i<1或者i>ListLength(L)时,删除位置无效 { cout << "删除的位置无效!!!" << endl; return false; } q = p->next; p->next = q->next; delete q ;//释放空间 return true; } LNode* LocateElem(linkList L, ElemType e) { LNode* p = L; while (p && (p->data != e)) { p = p->next; } return p; } bool GetLElem(linkList& L,int i,ElemType &e) { LNode* p; p = L->next; int j = 1; while (p && j < i) { p = p->next; ++j; } if (!p || j > i) { printf("n位置不合法!!n");//i值不合法 return false; } e = p->data; return true; } //遍历输出函数 void PrintList(linkList L) { linkList p = L->next;//跳过头结点 if (ListLength(L)) { cout << "当前单链表所有元素:"; while (p) { cout < data<<" "; p = p->next; } printf("n"); } else { cout << "当前单链表已空!" << endl; } } void Insert(linkList& L) { int place; ElemType e; bool flag; cout << "请输入要插入的位置(从1开始)及元素:" << endl; cin >> place >> e; flag = ListInsert(L, place, e); if (flag) { cout << "插入成功!!!" << endl; PrintList(L); } } void Delete(linkList L) { int place; bool flag; cout << "请输入要删除的位置:" << endl; cin >> place; flag = ListDelete(L, place); if (flag) { cout << "删除成功!!!" << endl; PrintList(L); } } void Search(linkList L) { ElemType e; LNode* q; cout << "请输入要查找的值:" << endl; cin >> e; q = LocateElem(L, e); if (q) { cout << "找到该元素!" << endl; } else cout << "未能找到该元素!" << endl; } void GetElem(linkList L) { int i; ElemType e; bool flag; cout << "请输入要查找的结点位置:" << endl; cin >> i; flag = GetLElem(L, i, e); if (flag) { cout << "该元素为:" << e << endl; } else { cout << "位置不合理!" << endl; } } void menu() { printf("********1.插入 2.删除*********n"); printf("********3.查找 4.输出*********n"); printf("***5.创建(头) 6.***创建(尾)n"); printf("********7.取值 8.退出*********n"); } int main() { linkList L; int choice; InitList(L); while (1) { menu(); cout << "请输入菜单序号:" << endl; cin >> choice; if (choice == 8) break; switch (choice) { case 1:Insert(L); break; case 2:Delete(L); break; case 3:Search(L); break; case 4:PrintList(L); break; case 5:CreateList_H(L); break; case 6:CreateList_R(L); break; case 7:GetElem(L); break; default:cout << "输入错误!!!" << endl; } } return 0; }



