话不多谁直接上代码,尊重原创,谢谢~
#include <iostream>
using namespace std;
typedef struct Lnode {
int data; //结点数据域
Lnode* next; //结点指针域
}Lnode, * LinkList; //LinkList为指向结构体Lnode的指针类型
//---------------------------------------------初始化参数
void InitList(LinkList& L) {
L = new Lnode; //开辟空间给新结点L
L->next = NULL; //为新结点的指针域置空
cout << "初始化完成" << endl;
}
//---------------------------------------------链表初始(尾插法)插入操作
void CreateLink(LinkList& L, int n) {
Lnode* p, * s; //生成两个新指针
s = L; //将s指向链表L头结点
for (int i = 1; i <= n; i++) {
p = new Lnode;
cout << "请输入第" << i << "个元素:";
cin >> p->data; //输入元素
s->next = p; //将生成的p结点指向头结点的下一个(L->next)
s = p; //将L这个指针指向p结点,利用循环尾插发创建单链表
}
s->next = NULL;
}
//---------------------------------------------链表初始(头插法)插入操作
void InsertLink(LinkList& L, int n) {
Lnode* p, * s; //新定义头结点s和要头插法插入的结点p
s = L; //将s指向链表L头结点
for (int i = 1; i <= n; i++){
p = new Lnode;
cout << "请输入要插入第"<<n-i+1<<"个元素" ;
cin >> p->data;
p->next=s->next; //将p->next结点指向s->next
s->next = p; //将头结点的下一个(s->next)指向p结点
}
}
//---------------------------------------------链表查找指定元素,并且返回位置
void Getdata(LinkList& L, int c) {
Lnode* p = new Lnode; //生成新的指针
p = L->next; int j=1; //将p指针指向首元结点
while (p && p->data != c) { //判断如果首元结点存在并且值域不等于我要查找的值时继续循环
p = p->next;
j++; //给次指针向下指一次,j就自增一次
}
if (p->data==c){ //当值域和我要查找的元素相同时返回提示
cout << "获取成功,您获取元素" << c << "的位置在链表的第" << j << "个。" << endl << endl;
}
else {
cout << "抱歉,您要获取的内容不在链表里面!" << endl;
}
}
//---------------------------------------------链表更新修改参数
void updateList(LinkList& L, int e) {
Lnode* p = L; //生成新的指针
int count = 0; //count为了计数,找到我要修改的元素位置
while (p->next != NULL) { //判断当指针非空继续执行
count++;
p = p->next; //指针向下移动一次,count自增一次
while (count == e) { //将修改的位置与查找的位置相同时,
cout << "修改为:";
int f; cin >> f;
p->data = f; //将结点的data赋值修改
break;
}
}
}
//---------------------------------------------链表删除给定位置元素
void DeleteList(LinkList& L,int d) {
Lnode* p = new Lnode; //创建p,q指针
Lnode* q = new Lnode;
p = L; //将p指向链表L
int j = 0; //j是为了找到要删除第d个的前一个元素
while (p->next&&j<d-1){ //当p->next存在时(头指针下一个元素)并且要删除的元素位置长度大于查找的长度,
p = p->next; //才可以继续循环,将p指向p的next,并且j++增加长度
++j;
}
//如果p的下一个结点不存在,或者查询的长度已经大于要删除的元素位置,给出提示;
if (!(p->next) && j > d - 1) cout << "删除失败~" << endl;
q = p->next; //否则将p-next赋个给q暂存
p->next = q->next; //将p->next指向下一个指针的下一个指针(q->next;)
delete q; //最后删除q结点即可
cout << "删除成功! ";
}
//---------------------------------------------链表的长度
void ListLength(LinkList L) {
Lnode* p = L; //生成新的指针
int count = 0; //count为了计数,来计算链表的长度
while(p->next != NULL){ //当指针非空可以继续循环,直至指针指向空的结点时,长度不在增加
count++;
p = p->next;
}
cout << count;
}
//---------------------------------------------链表取值&输出操作
void PrintList(LinkList& L) {
Lnode* p = new Lnode; //新生成一个结点p
p = L; //将p指向链表L
cout << "当前链表为:";
while (p->next != NULL) { //输出链表中元素判断依据:最后一个结点是空的时候跳出循环
cout << p->next->data << " \t"; //取出头指针下一个结点的元素
p = p->next; //让指针的下一个命名为p
}
cout << endl << endl;
}
int main() {
LinkList L; //定义一个链表L
cout << "1.初始化操作";
InitList(L); //初始化操作
cout << "2.请输入需要存取的元素的个数:";
int a; cin >> a;
CreateLink(L, a); //尾插法插入操作
PrintList(L); //打印链表
cout << "3.想利用头插法插入几个元素呢:"; //头插法输入打印
int b; cin >> b;
InsertLink(L, b);
cout << "插入成功,";
PrintList(L);
cout << "4.获取操作,请出入你要获取位置的元素:";//获取制定元素位置
int c; cin >> c;
Getdata(L,c);
cout << "5.删除操作,请出入你要删除的元素位置:";//删除给出相应位置的元素
int d; cin >> d;
DeleteList(L,d);
PrintList(L);
cout << "6.当前链表的长度为:"; //获取当前链表的长度
ListLength(L);
cout << ",给您一次修改链表的机会,您想修改第几个:" ;//修改指定位置的元素
int e; cin >> e;
updateList(L,e);
PrintList(L);
}
运行代码截图: