//输入输出头函数
#include<iostream>
using namespace std;
#define OK 1;
#define ERROR 0;
#define OVERFLOW -2;
typedef int Elemtype;
/**
* 单链表的存储结构
*/
typedef struct LNode {
Elemtype data;
struct LNode *next;
} LNode, *LinkList;
/**
* 尾插法创建单链表
*/
void CreateList_R(LinkList &L, int n) {
LNode *r, *p;
//构建一个空的单链表L
//生成新结点作为头结点,用头指针L指向头结点
L = new LNode();
//头指针指针域置空
L->next = NULL;
//尾指针r指向头结点
r = L;
for (int i = 0; i < n; i++) {
//生成新结点
p = new LNode();
//输入元素值赋给新结点*p的数据域
cout << "请输入要插入的整型数据:" << endl;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
cout << "输入完成!!" << endl;
}
/**
* 遍历输出单链表
*/
void ErgodicList(LinkList &L) {
LNode *p;
p = L->next;
if (p == NULL) {
cout << "此链表为空" << endl;
}
while (p) {
cout << p->data << endl;
p = p->next;
}
}
/**
* 查找指定结点
*/
LNode *LocateElem(LinkList &L, Elemtype e) {
LNode *p;
//初始化,p指向首元结点
p = L->next;
while (p && p->data != e) {
p = p->next;
}
//查找成功返回值为e的结点地址p,查找失败返回NULL
return p;
}
/**
* 清空单链表
*/
void EmptyList(LinkList &L) {
LNode *p;
while (L->next) {
p = L->next;
L->next = p->next;
delete p;
}
cout << "链表清除成功!" << endl;
}
/**
* 删除指定结点
*/
void DeleteList(LinkList &L) {
LNode *p;
LNode *q;
p = L;
int temp;
cout << "请输入要删除的结点" << endl;
cin >> temp;
while (p->next && p->next->data != temp) {
p = p->next;
}
if (!p->next) {
cout << "单链表中没有此结点数据!" << endl;
} else {
q = p->next;
p->next = q->next;
free(q);
cout << "此结点数据删除成功!!" << endl;
}
}
/**
* 修改指定结点
*/
void ChangeList(LinkList &L) {
LNode *p;
p = L;
int a, b;
cout << "请输入要修改的结点" << endl;
cin >> a;
while (p->next && p->next->data != a) {
p = p->next;
}
if (!p->next) {
cout << "此单链表中没有要修改的数据" << endl;
} else {
cout << "请输入要将此结点修改为何值" << endl;
cin >> b;
p->next->data = b;
cout << "数据修改成功!!" << endl;
}
}
void OutPut() {
LNode *L;
int choose = 0;
printf("1:创建或者添加链表结点数据\n");
printf("2:遍历链表\n");
printf("3:查找指定结点\n");
printf("4:链表清空\n");
printf("5:删除指定结点\n");
printf("6:修改指定结点\n");
printf("0:退出当前操作\n");
while (1) {
printf("请输入你要选择的功能前的序号:");
cin >> choose;
if (choose == 0) {
cout << "系统退出成功" << endl;
break;
}
switch (choose) {
case 1: {
int n;
cout << "请输入要插入的整型的数量:" << endl;
cin >> n;
CreateList_R(L, n);
break;
}
case 2: {
ErgodicList(L);
break;
}
case 3: {
Elemtype e;
LNode *s;
cout << "请输入要查找的数据:" << endl;
cin >> e;
s = LocateElem(L, e);
if (s == NULL) {
cout << "该单链表没有此数据" << endl;
} else {
cout << "查找完成,要查找的数据的结点地址为:"
<< s
<< endl;
}
break;
}
case 4: {
EmptyList(L);
break;
}
case 5: {
DeleteList(L);
break;
}
case 6: {
ChangeList(L);
break;
}
}
}
}
int main() {
OutPut();
return 0;
}
02.C语言单链表的创建、遍历、查找、清空、删除、修改、退出
最新推荐文章于 2024-01-13 23:34:29 发布