#include"stdio.h"
typedef struct Link{
int elem;
struct Link *next;
}Link;
int n;//链表长度
//创建链表
void CreatList(Link &L){
Link *p;
p = &L;//建一个有根节点的链表
printf("创建链表,请输入链表元素,用空格隔开:\n");
for (int i = 0; i < n; i++){
Link *q;
q = new Link;//局部变量要初始化,才可以使用
scanf_s("%d", &q->elem);
q->next = NULL;
p->next = q;
p = q;
}
printf("建表成功\n\n");
}
//打印输出链表
void PrintList(Link &L){
printf("链表元素为:\n");
Link *p;
p = &L;
p = p->next;
for (int i = 0; i < n; i++){
printf("%d ", p->elem);
p = p->next;
}
printf("\n打印输出成功\n\n");
}
//1 更新某个位置的元素值
void UpdateList(Link &L){
int pos;
printf("请输入要更新的位置:");
y1:
scanf_s("%d", &pos);
if (pos > n || pos < 0){
printf("位置越界,请重新输入\n");
goto y1;
}
int temp;
printf("请输入要更新后的元素的值:");
scanf_s("%d", &temp);
Link *p;
p = &L;
p = p->next;
for (int i = 0; i < n; i++){
if (i == pos - 1){
p->elem = temp;
break;
}
p = p->next;
}
printf("操作成功\n\n");
}
//2 某个位置插入一个元素
void InsertList(Link &L){
int pos;
printf("请输入要插入的位置:");
y1:
scanf_s("%d", &pos);
if (pos > n || pos < 0){
printf("位置越界 请重新输入\n");
goto y1;
}
int temp;
printf("请输入要插入的元素的值:");
scanf_s("%d", &temp);
Link *p;
p = &L;//与更新操作的不同,p指向当前所扫描节点的前驱
for (int i = 0; i < n; i++){
if (i == pos - 1){
Link *q;
q = new Link;
q->elem = temp;
q->next = p->next;
p->next = q;
n++;
break;
}
p = p->next;
}
printf("操作成功\n\n");
}
//3 删除某个位置的元素
void DeleteList(Link &L){
int pos;
printf("请输入要删除的位置:");
y1:
scanf_s("%d", &pos);
if (pos > n || pos < 0){
printf("位置越界 请重新输入\n");
goto y1;
}
Link *p;
p = &L;
for (int i = 0; i < n; i++){
if (i == pos - 1){
p->next = p->next->next;
n--;
break;
}
}
printf("操作成功\n\n");
}
//4 查找某个值是否在链表中
void FindList(Link &L){
int temp;
printf("请输入要查找的元素的值:");
scanf_s("%d", &temp);
Link *p;
p = &L;
p = p->next;
for (int i = 0; i < n; i++){
if (p->elem == temp){
printf("所查找元素的位置为%d\n", i + 1);
}
p = p->next;
}
printf("操作成功\n\n");
}
//5 对链表进行逆置 每次都将节点直接跟在根节点的后面
void ReverseList(Link &L){
Link *p,*q;
p = NULL;//初始的后继为NULL
q = &L;
q = q->next;
while (q != NULL){
Link *r;
r = q->next;//首先将当前节点q的后继r存起来!!
L.next = q;//将当前节点q直接跟在根节点L后面
q->next = p;//更新当前节点q的新的后继p
p = L.next;//更新下一个要存节点的后继p
q = r;//更新当前节点为当前节点在原来链表中的后继
}
}
void view(){
printf("链表操作:\n");
printf("1 更新某个位置的元素值\n");
printf("2 某个位置插入一个元素\n");
printf("3 删除某个位置的元素\n");
printf("4 查找某个值是在链表中的位置\n");
printf("5 对链表进行逆置\n");
printf("0 结束\n");
}
int main(){
Link L;
printf("链表操作\n");
printf("请输入新建链表的长度:\n");
scanf_s("%d", &n);
CreatList(L);
PrintList(L);
int choose = 1;
while (choose){
view();
printf("请输入所要进行的操作:");
scanf_s("%d", &choose);
if (choose == 1){
UpdateList(L);
PrintList(L);
}
else if (choose == 2){
InsertList(L);
PrintList(L);
}
else if (choose == 3){
DeleteList(L);
PrintList(L);
}
else if (choose == 4){
FindList(L);
PrintList(L);
}
else if (choose == 5){
ReverseList(L);
PrintList(L);
}
}
return 0;
}