#include <stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
typedef struct LNode { //创建一个结点
ElemType data;
struct LNode* next;
}LNode, * LinkList;
void CreatList_L(LinkList L,int n) { //创建一个链表并赋值
for (int i = n;i > 0;i--) {
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf_s("%d", &(p->data));
p->next = L->next;
L->next = p;
}
}
void PutOut_L(LinkList L) { //输出链表
LinkList p = L->next;
while (p) {
printf("%d \t",p->data);
p = p->next;
}
}
Status ListInsert_L(LinkList L, int i, ElemType e) { //在第i个位置前插入一个元素e
LinkList p = L;
int j = 0;
while (p && j < i - 1) {
p = p->next;
j++;
}
if (!p || j > i - 1) {
return 0;
}
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
Status GetElem_L(LinkList L, int i, ElemType e) { //查找第i个元素
LinkList p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
if (!p || j > i) { return 0; }
e = p->data;
return e;
}
Status DeleteElem_L(LinkList L, int i) { //删除第i个元素
LinkList p = L;
int j = 0;
while (p->next && j < i - 1) {
p = p->next;
j++;
}
if (!(p->next) || j > i - 1) { return 0; }
LinkList q = p->next;
p->next = q->next;
free(q);
return 1;
}
void Menu()
{
int x = 0;
int n = 0;
int e = 0;
int m = 0;
int a = 0;
int b = 0;
int c = 0;
LinkList L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
do {
printf("请输入操作:\n");
printf("0、 退出\n");
printf("1、创建新的单链表\n");
printf("2、查找链表中的数据\n");
printf("3、在链表中插入数据\n");
printf("4、删除数据\n");
printf("\n");
scanf_s("%d", &x);
if (x > 4 || x < 0)
{
printf("无效操作!");
continue;
}
switch (x)
{
case 1:
printf("请输入链表长度:\n");
scanf_s("%d",&n);
printf("请输入链表数据:\n");
CreatList_L(L,n);
printf("创建的链表为:");
printf("\n");
PutOut_L(L);
printf("\n");
printf("\n");
continue;
case 2:
printf("请输入要查找第几个数据:\n");
scanf_s("%d", &a);
if (a < 1 || a > n) {
printf("未找到第%d个数据! \n",a);
printf("\n");
continue; }
m = GetElem_L(L,a,e);
printf("第%d个数据是:%d \n",a,m);
printf("\n");
continue;
case 3:
printf("请输入要插入数据的位置:\n");
scanf_s("%d", &b);
if (b < 1 || b > n) {
printf("未找到第%d个数据! \n", b);
printf("\n");
continue;
}
printf("请输入要插入的数据:\n");
scanf_s("%d", &e);
ListInsert_L(L,b,e);
printf("插入后的链表为:\n");
PutOut_L(L);
printf("\n");
printf("\n");
continue;
case 4:
printf("请输入要删除的数据的位置:\n");
scanf_s("%d", &c);
if (c < 1 || c > n) {
printf("未找到第%d个数据! \n", c);
printf("\n");
continue;
}
DeleteElem_L(L,c);
printf("删除后的链表为:\n");
PutOut_L(L);
printf("\n");
printf("\n");
continue;
default:
break;
}
} while (x);
}
int main()
{
Menu();
}
此处附上源码仅表留念初学链表苦苦挣扎的几天