#include
#include
#include
#define MAXSIZE 10
typedef struct student {
int id; // 学号
float score; // 成绩
} Student;
typedef struct node {
Student data;
struct node* next;
} Node, *LinkList;
// 初始化链表
void InitList(LinkList* L) {
*L = NULL;
}
// 用前插法插入从自己学号开始往后数,10位同学
void InsertFront(LinkList* L, int startId, int count) {
for (int i = 0; i < count; ++i) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data.id = startId + i;
newNode->data.score = (startId + i) % 100; // 假设成绩为学号模100
newNode->next = *L;
*L = newNode;
}
}
// 输出所有链表数据
void ShowList(LinkList L) {
Node* p = L;
printf("链表数据:\n");
while (p != NULL) {
printf("学号: %d, 成绩: %.2f\n", p->data.id, p->data.score);
p = p->next;
}
}
// 查找链表中第i个学生
void GetElem(LinkList L, int i) {
Node* p = L;
int j = 0;
while (p != NULL && j < i) {
p = p->next;
++j;
}
if (p == NULL) {
printf("查找失败,没有第%d个学生\n", i);
} else {
printf("学号: %d, 成绩: %.2f\n", p->data.id, p->data.score);
}
}
// 在第i个元素前插入一个元素
void ListInsert(LinkList* L, int i, int id, float score) {
Node* p = *L;
int j = 0;
while (p != NULL && j < i - 1) {
p = p->next;
++j;
}
if (p == NULL) {
printf("插入失败,没有第%d个学生\n", i);
} else {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data.id = id;
newNode->data.score = score;
newNode->next = p->next;
p->next = newNode;
}
}
// 删除链表中第i个元素
void ListDelete(LinkList* L, int i) {
Node* p = *L;
Node* prev = NULL;
int j = 0;
while (p != NULL && j < i) {
prev = p;
p = p->next;
++j;
}
if (p == NULL) {
printf("删除失败,没有第%d个学生\n", i);
} else {
prev->next = p->next;
free(p);
}
}
// 释放链表中所有结点
void DestroyList(LinkList* L) {
Node* p = *L;
while (p != NULL) {
Node* temp = p;
p = p->next;
free(temp);
}
*L = NULL;
}
int main() {
LinkList L;
InitList(&L);
InsertFront(&L, 2000, 10);
ShowList(L);
GetElem(L, 25);
ListInsert(&L, 25, 2001, 85.5);
ShowList(L);
ListDelete(&L, 30);
ShowList(L);
DestroyList(&L);
return 0;
}