#include <stdio.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
struct student {
long num;
float score;
struct student *next;
};
int n;
int main() {
struct student *creat();
struct student *del(struct student *head, long num);
struct student *insert(struct student *head, struct student *stud);
void print(struct student*);
struct student *head, *stu;
long del_num;
printf("请输入数据:\n");
head = creat();
print(head);
printf("输入要删除的学号:\n");
scanf_s("%ld", &del_num);
while (del_num!=0)
{
head = del(head, del_num);
print(head);
printf("输入要删除的学号:\n");
scanf_s("%ld", &del_num);
}
printf("输入要插入的结点:\n");
stu= (struct student *) malloc(LEN);
scanf_s("%ld,%f", &stu->num, &stu->score);
while (stu->num != 0)
{
head = insert(head,stu);
print(head);
printf("输入要插入的结点:\n");
stu = (struct student *) malloc(LEN);
scanf_s("%ld,%f", &stu->num, &stu->score);
}
return 0;
}
//创建动态链表函数
struct student *creat() {
struct student *p1, *p2, *head;
n = 0;
p1 = p2 = (struct student *) malloc(LEN);
scanf_s("%ld,%f", &p1->num, &p1->score);
head = NULL;
while (p1->num != 0)
{
n = n + 1;
if (n == 1)
{
head = p1;
}
else
{
p2->next = p1;
}
p2 = p1;
p1 = (struct student *) malloc(LEN);
scanf_s("%ld,%f", &p1->num, &p1->score);
}
p2->next = NULL;
return(head);
}
//定义删除结点的del函数
struct student *del(struct student *head, long num) {
struct student *p1, *p2;
p2 = NULL;
if (head == NULL)
{
printf("该链表是空链表");
return(head);
}
p1 = head;
while (num != p1->num && p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (num == p1->num)
{
if (p1 == head) head = p1->next;
else p2->next = p1->next;
printf("已删除:%ld", num);
n = n - 1;
}
else printf("没有找到该数据");
return(head);
}
//定义插入结点的函数
struct student *insert(struct student *head, struct student *stud) {
struct student *p0, *p1, *p2;
p0 = stud;
p1 =p2= head;
if (head == NULL)
{
head = p0;
p0->next = NULL; }
//return(head); }
else
{ while (p0->num > p1->num && p1->next != NULL)
{ p2 = p1;
p1 = p1->next; }
}
if (p0->num <= p1->num)
{ if (head == p1) head = p0;
else { p2->next = p0; }
p0->next = p1;
}
else{ p1->next = p0; p0->next = NULL;}
n = n + 1;
return(head);
}
//定义输出函数
void print(struct student *head) {
struct student *p;
printf("\n现在的链表记录如下:\n");
p = head;
if (head != NULL)
do {
printf("%ld %3.1f\n", p->num, p->score);
p = p->next;
} while (p != NULL);
}
c语言 单向动态链表增删
最新推荐文章于 2022-01-12 16:42:34 发布