- 代码
- main.cpp
#include<iostream>
using namespace std;
typedef struct STU
{
char name[20];
char sno[20];
int age;
float score;
}Student;
typedef struct LNode
{
Student data;
struct LNode *next;
}LNode, *LinkList;
//初始化(带头结点的单链表)
int InitList(LinkList &L)
{
L = new LNode;
L->next = NULL;
return 1;
}
//判断链表是否为空
int ListEmpty(LinkList L)
{
if (L->next == NULL)
{
return 1; // 链表为空
}
else
{
return 0;//链表非空
}
}
//获取链表长度
int ListLength(LinkList L)
{
int length = 0;
LNode *p;
p = L->next;
while (p)
{
p = p->next;
length++;
}
return length;
}
//遍历链表
void TraveList(LinkList L)
{
LNode *p;
p = L->next;
printf("链表结构如下:\n");
while (p)
{
printf("%s %s %d %.2f", p->data.name, p->data.sno, p->data.age, p->data.score);
printf("\n");
p = p->next;
}
}
//插入操作
int ListInsert(LinkList &L, int location, Student &e)
{
//在链表L的location位置插入元素e
LNode *p;
int j = 0;
p = L;
while (p&&j < location - 1)
{
p = p->next;
j++;
}
if (!p || j > location - 1)
{
return 0;
}
LNode *s;
s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return 1;
}
//删除操作
int ListDelete(LinkList &L, int location, Student &e)
{
//删除L中location位置的元素,并用e返回其值
LNode *p;
int j = 0;
p = L;
while (p->next&&j < location - 1)
{
p = p->next;
j++;
}
if (!(p->next) || j > location - 1)
{
return 0;
}
LNode *q;
q = p->next;
p->next = q->next;
e = q->data;
delete q;
return 1;
}
//头插法法创建单链表
void CreateList1(LinkList &L, int n)
{
//创建长度为n的单链表
L = new LNode;
L->next = NULL;
printf("请输入链表元素:\n");
for (int i = 0; i < n; i++)
{
printf("请输入第%d个元素值:\n", i + 1);
LNode *p;
p = new LNode;//生成新结点
//输入
printf("请输入姓名:");
scanf("%s", p->data.name);
printf("请输入学号:");
scanf("%s", p->data.sno);
printf("请输入年龄:");
scanf("%d", &p->data.age);
printf("请输入成绩:");
scanf("%f", &p->data.score);
// 插入
p->next = L->next;
L->next = p;
}
}
// 尾插法创建单链表
void CreateList2(LinkList &L, int n)
{
L = new LNode;
L->next = NULL;
LNode *r;
r = L;
printf("请输入链表元素值:\n");
for (int i = 0; i < n; i++)
{
LNode *p;
p = new LNode;
printf("请输入第%d个元素的值:\n", i + 1);
printf("请输入姓名:");
scanf("%s", p->data.name);
printf("请输入学号:");
scanf("%s", p->data.sno);
printf("请输入年龄:");
scanf("%d", &p->data.age);
printf("请输入成绩:");
scanf("%f", &p->data.score);
p->next = NULL;
r->next = p;
r = p;
}
}
int main()
{
LinkList L;
printf("1.初始化链表\n");
printf("2.创建链表\n");
printf("3.插入操作\n");
printf("4.删除操作\n");
printf("0.退出\n");
int choose = -1;
while (choose != 0)
{
printf("请选择操作:\n");
scanf("%d", &choose);
switch (choose)
{
case 1:
{
if (InitList(L))
{
printf("链表初始化成功!\n");
}
else
{
printf("链表初始化失败!\n");
}
break;
}
case 2:
{
printf("1.头插法创建单链表\n");
printf("2.尾插法创建单链表\n");
printf("请选择操作:\n");
int choose1;
scanf("%d", &choose1);
switch (choose1)
{
case 1:
{
printf("请输入链表长度:\n");
int n;
scanf("%d", &n);
CreateList1(L, n);
TraveList(L);
break;
}
case 2:
{
printf("请输入链表长度:\n");
int n;
scanf("%d", &n);
CreateList2(L, n);
TraveList(L);
break;
}
}
break;
}
case 3:
{
printf("请输入插入的位置:\n");
int location;
scanf("%d", &location);
Student stu;
printf("请输入姓名:");
//char name[20];
scanf("%s", stu.name);
printf("请输入学号:");
scanf("%s", stu.sno);
printf("请输入年龄:");
scanf("%d", &stu.age);
printf("请输入成绩:");
scanf("%f", &stu.score);
if (ListInsert(L, location, stu))
{
printf("插入成功!\n");
TraveList(L);
}
else
{
printf("插入失败!\n");
}
//TraveList(L);
break;
}
case 4:
{
printf("请输入要删除的元素的位置:\n");
int location;
scanf("%d", &location);
Student stu;
if (ListDelete(L, location, stu))
{
printf("删除成功!\n");
printf("删除的元素值是:\n");
printf("%s %s %d %.2f\n", stu.name, stu.sno, stu.age, stu.score);
TraveList(L);
}
else
{
printf("删除失败!\n");
}
break;
}
}
}
system("pause");
}
- 运行结果