• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wchenfeng

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

编写一个链表结构,读取任意多个用户输入。之后将“2017000 85.0”和“2017006 85.0”“2017013 85.0”这三个数据插入链表,再将链表数据打印

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>		//malloc free等函数会使用到这头文件

//定义链表的节点
typedef struct node_s {
    long num;		//学号
    float score;	//成绩
    struct node_s* next;	//指向链表下一个节点的指针
} node_t; 
//node_t是typedef定义出来的节点类型

//n用来统计链表的长度
int n;

//创建一个包含学生信息的链表
node_t* create()
{
	//申请头指针,和两个操作用的指针p1 p2
    node_t *head, *p1, *p2;
	
	//初始化数据
	n = 0;			//n用来统计链表的长度,初始化为0
	head = NULL;	//头指针初始化为NULL指针,链表为空
  
	//循环读取用户输入,直到读取到学号为0时,认为输入结束
    while (1) {
		//申请内存来创建节点,用p1指向新申请的节点
		//正常这里要判断一下p1是否为NULL,这里省略
        p1 = (node_t*) malloc(sizeof(node_t));
		//读取用户输入数据
        scanf("%ld %f", &p1->num, &p1->score);
		//如果读取到学号为0时,认为输入结束
		if(p1->num == 0){
			//本节点即尾节点,next设置为空指针
			p2->next = NULL;
			//p1节点为0的无需使用,要释放内存,书上漏了
			free(p1);
			break;
		}

		//链表长度加1
        n++;
        if (n == 1) {
			//如果链表长度为1,说明当前节点p1是首节点
			//用head记录下当前首节点
            head = p1;
		} else {
			//如果链表长度不为1,说明当前节点p1不是首节点
			//用上一个节点P2的next记录下当前节点
            p2->next = p1;
		}
		//p2记录下本轮的节点,用于下一轮有新节点时,
		//在p2->next = p1;语句中使用
        p2 = p1;
    }

	//返回新生成的链表的首节点,用于外部访问链表
    return (head);
}

//遍历链表,打印节点内容
void print(node_t *head)
{
    node_t *p;
	//如果链表为空,则不用访问了,直接返回
    if (head == NULL) {
        return;
    }
	//p初始化为head指向的链表首元素
    for (p = head; p != NULL; p = p->next) {
		//如果p指向的不是空指针,则访问它的数据
        printf("%ld %5.1f\n", p->num, p->score);
		//访问完数据后,p要指向当前元素的下一个元素 p = p->next
    }
	//如果p指向的是空指针,则跳出循环
}

//遍历链表,将新节点stud插入到链表中的适当位置,保证链表的学号顺序从小到大
node_t *insert(node_t *head, node_t *stud)
{
    node_t *p0, *p1, *p2;
 
    p1 = head;
    p0 = stud;
 
	//创建首节点
    if (head == NULL) {
        head = p0;
        p0->next = NULL;
        n++;
        return head;
    }
 
	//找到插入位置
    for (p1 = head; p1->next != NULL; p2=p1, p1 = p1->next) {
        if(p0->num < p1->num) {
            break;
        }
    }
 
    if (p0->num <= p1->num) { 
        if (p1 == head) {	//找到插入位置,插入队首
            head = p0;
			p0->next = p1;
        } else {	//找到插入位置,插入队列中间位置
            p2->next = p0;
            p0->next = p1;
        }
    } else {//找不到插入位置,插入队尾
        p1->next = p0;
        p0->next = NULL;
    }
 
    n++;
 
    return head;
}
//插入
node_t* test_14_3(void)
{
    node_t* head;
    node_t* stud;

    head = create();

    //插入头部
    stud = (node_t*) malloc(sizeof(node_t));
    stud->num = 2017000;
    stud->score = 85.0;
    head = insert(head, stud);

    //插入中间
    stud = (node_t*) malloc(sizeof(node_t));
    stud->num = 2017006;
    stud->score = 85.0;
    head = insert(head, stud);

    //插入尾部
    stud = (node_t*) malloc(sizeof(node_t));
    stud->num = 2017013;
    stud->score = 85.0;
    head = insert(head, stud);

    print(head);

	return head;
}

int main(void)
{
    test_14_3();
}

输入

2017001 81.0
2017002 82.0
2017003 83.0
2017004 84.0
2017005 85.0
2017010 90.0
0 0
 

输出

2017000  85.0
2017001  81.0
2017002  82.0
2017003  83.0
2017004  84.0
2017005  85.0
2017006  85.0
2017010  90.0
2017013  85.0

posted on 2022-04-12 20:03  王陈锋  阅读(24)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3