静态链表
#include<stdio.h>
typedef struct Teacher
{
int data;
struct Teacher *next;
}Teacher;
int main(void)
{
//静态链表
//固定个数 ,结点的内存生命周期
Teacher t1, t2, t3;
t1.data = 1;
t2.data = 2;
t3.data = 3;
t1.next = &t2;
t2.next = &t3;
t3.next = NULL;
return 0;
}
动态创建一个链表(创建一个表头表示整个链表)
- 创建链表(创建一个表头表示整个链表)
- 创建结点
- 插入结点
- 删除结点
- 打印遍历链表(测试)
#include<stdio.h>
#include<stdlib.h>
struct Node {
int data; //数据域
struct Node* next; //指针域
};
struct Node* creatList()
{
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
//headNode 成为了结构体变量
//变量使用前必须被初始化
//headNode->data = 1;
headNode->next = NULL;
return headNode;
}
//创建结点
struct Node* creatNode(int data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//打印结点
void printList(struct Node *headNode)
{
struct Node* pMove = headNode->next;
while (pMove)
{
printf("%d\t", pMove->data);
pMove = pMove->next;
}
printf("\n");
}
//插入结点
void insertNodeByHead(struct Node* headNode, int data)
{
//创建插入的结点
struct Node* newNode = creatNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//删除指定结点
void deleteNodeByAppoin(struct Node* headNode, int posData)
{
struct Node* posNode = headNode->next; //posNode要从表头的下一个结点开始找
struct Node* posNodeFront = headNode;
if (posNode == NULL)
printf("无法删除,链表为空\n");
else
{
while (posNode->data != posData)
{
posNodeFront = posNode;
posNode = posNodeFront->next;
if (posNode == NULL)
{
printf("没有找到相关信息,无法删除\n");
return;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
}
int main(void)
{
struct Node* list = creatList();
insertNodeByHead(list, 1);
insertNodeByHead(list, 2);
insertNodeByHead(list, 3);
printList(list);
deleteNodeByAppoin(list, 2);
printList(list);
return 0;
}
学以致用——学生成绩管理系统
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
struct student
{
char name[20];
int num;
int math;
};
struct Node {
struct student data; //数据域
struct Node* next; //指针域
};
struct Node* creatList()
{
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
//headNode 成为了结构体变量
//变量使用前必须被初始化
//headNode->data = 1;
headNode->next = NULL;
return headNode;
}
//创建结点
struct Node* creatNode(struct student data)
{
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
//打印结点
void printList(struct Node* headNode)
{
struct Node* pMove = headNode->next;
printf("name\tnum\tmath\n");
while (pMove)
{
printf("%s\t%d\t%d\n", pMove->data.name, pMove->data.num, pMove->data.math);
pMove = pMove->next;
}
printf("\n");
}
//插入结点
void insertNodeByHead(struct Node* headNode, struct student data)
{
//创建插入的结点
struct Node* newNode = creatNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//删除指定结点
void deleteNodeByAppoinNum(struct Node* headNode, int num)
{
struct Node* posNode = headNode->next; //posNode要从表头的下一个结点开始找
struct Node* posNodeFront = headNode;
if (posNode == NULL)
printf("无法删除,链表为空\n");
else
{
while (posNode->data.num != num)
{
posNodeFront = posNode;
posNode = posNodeFront->next;
if (posNode == NULL)
{
printf("没有找到相关信息,无法删除\n");
return;
}
}
posNodeFront->next = posNode->next;
free(posNode);
}
}
int main(void)
{
struct Node* list = creatList();
/*insertNodeByHead(list, 1);
insertNodeByHead(list, 2);
insertNodeByHead(list, 3);
printList(list);
deleteNodeByAppoinNum(list, 2);
printList(list);*/
struct student info;
while (1)
{
printf("请输入学生姓名 学号 数学成绩:");
setbuf(stdin, NULL);
scanf("%s%d%d", info.name, &info.num, &info.math);
insertNodeByHead(list, info);
printf("continue(Y/N)?\n");
setbuf(stdin, NULL);
int choice = getchar();
if (choice == 'N' || choice == 'n')
{
break;
}
}
printList(list);
printf("请输入要删除的学生的学号:");
scanf("%d", &info.num);
deleteNodeByAppoinNum(list, info.num);
printList(list);
return 0;
}