链表之有头链表

简介: 链表之有头链表
//有头链表
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define N   sizeof(struct student)
 struct student
{ char name[20];
  int num;
  int score;
 
  struct student * next;
 
};
struct student * creat_list(int n);
void print_list(struct student* head);
void add_list(struct student* head);
void delete_list(struct student* head);
void sort_list(struct student* head);
 
 
int main (void)
{ struct student * Head;
  int n;
  scanf("%d",&n);    //输入你需要创建链表的长度
  Head=creat_list(n);//返回头结点的地址 创建链表
  print_list(Head);  //发送头节点的地址   输出链表
  add_list(Head);   //发送头节点的地址   插入
  delete_list(Head); //发送头节点的地址 删除
  sort_list(Head);  //发送头节点的地址  链表排序(这里是升序)
  print_list(Head);  //发送头节点的地址 再次输出
 
  return 0;
}
struct student * creat_list(int n)
{ int i=1;
  struct student *head,*p0,*p1;
  head=p0=(struct student* )malloc(N);//动态创建一块内存记为头结点
  p1=(struct student* )malloc(N);//动态创建一块内存记为首结点;
  scanf("%d %s %d",&p1->num,p1->name,&p1->score);
  while(i<n)
  { p0->next=NULL;
    p1->next=p0->next;
    p0->next=p1;
    p0=p1;
    p1=(struct student * )malloc(N);
    scanf("%d %s %d",&p1->num,p1->name,&p1->score);
    i++;
  }
  p0->next=p1;
  p1->next=NULL;
  return head;
 
}
void print_list(struct student* head)
{
  struct student *p0;
  p0=head->next;
  while(p0!=NULL)
  { printf("%s %d %d\n",p0->name,p0->num,p0->score);
    p0=p0->next;
  }
}
void add_list(struct student* head)
{
  struct student*p0,*p1=head;
  p0=(struct student* )malloc(N);
  scanf("%d %s %d",&p0->num,p0->name,&p0->score);
  head=head->next;
  while(head!=NULL)
  {
    if(head->num>p0->num)//插在链表的头结点后边或中间
    {   p0->next=p1->next;
        p1->next=p0;
        break;
    }
    p1=head;
    head=head->next;
  }
  if(head==NULL)//插在链表的最后
  { head->next=p0;
    p0->next=NULL;
  }
 
}
void delete_list(struct student* head)
{ struct student *p1=head;
  int num;
  scanf("%d",&num);
  head=head->next;
  while(head!=NULL)
  {
    if(head->num==num)
    {
      p1->next=head->next;
      free(head);
      break;
    }
 
    p1=head;
    head=head->next;
  }
  if(head==NULL)
  {
    p1->next=NULL;
    free(head);
  }
  
}
void sort_list(struct student* head)
{
  struct student *p0,*p1,*p2;
  char a[10];
  int m,n;
  for(p0=head->next;p0!=NULL;p0=p0->next)
  { p2=p0;
    for(p1=p0->next;p1!=NULL;p1=p1->next)
    {
      if(p2->num>p1->num)//升序排序
      {
        p2=p1;      
      }
    }
    if(p2!=p0)
    { m=p0->num;
      p0->num=p2->num;
      p2->num=m;
      strcpy(a,p0->name);
      strcpy(p0->name,p2->name);
      strcpy(p2->name,a);
      n=p0->score;
      p0->score=p2->score;
      p2->score=n;
    }
  }
  
}
相关文章
|
Scala 流计算
Flink / Scala - 使用 CountWindow 实现按条数触发窗口
CountWindow 数量窗口分为滑动窗口与滚动窗口,类似于之前 TimeWindow 的滚动时间与滑动时间,这里滚动窗口不存在元素重复而滑动窗口存在元素重复的情况,下面 demo 场景为非重复场景,所以将采用滚动窗口。......
1116 0
Flink / Scala - 使用 CountWindow 实现按条数触发窗口
|
7月前
|
架构师 安全 物联网
Apipost vs Apifox:高效API协作的差异化功能解析
作为企业级API架构师,深度体验APIPost与Apifox后发现几大亮点功能。目录级参数配置避免全局污染;WebSocket消息分组提升长连接管理效率;Socket.IO支持解决特定协议需求;接口锁定保障团队协作安全。大型团队适合APIPost的细粒度管控,复杂物联网项目需WebSocket分组,维护遗留系统离不开Socket.IO支持,初创团队可按需灵活选择。这些特性显著优化开发协作质量。
Playwright 测试重试
Playwright 测试重试
314 2
|
XML Java 数据库
Spring boot的最全注解
Spring boot的最全注解
399 4
|
算法 物联网 定位技术
基于BLE的商业综合体室内定位导航系统:低功耗室内导航与反向寻车
本文介绍了基于BLE技术的商场室内定位导航系统,涵盖系统设计思路、关键技术实现及实际应用效果。系统通过部署BLE信标和利用智能手机等设备,实现精准室内定位与导航,提升消费者购物体验。关键技术包括iBeacon蓝牙定位和A*寻路算法,应用于商场导航、AR实景导航及反向寻车等功能。
623 4
|
安全 Linux 网络安全
Linux 开放的端口太多了?教你一招找出所有开放的端口,然后直接干掉!
在 Linux 系统中,端口管理至关重要。本文介绍了如何使用 `netstat`、`lsof` 和 `nmap` 等工具查找开放端口,并通过关闭相关服务、修改防火墙规则或禁用网络接口来关闭这些端口,以提高系统安全性。注意不要随意关闭重要端口,谨慎操作并备份数据。
500 3
|
编解码 JSON 安全
使用search-guard加固安全为https访问
使用search-guard加固安全为https访问
|
数据可视化 Go 开发工具
cggit 简化 Git 提交、合并、分支偏移小神器,提升开发、修BUG效率!
cggit 简化 Git 提交、合并、分支偏移小神器,提升开发、修BUG效率!
233 0
|
域名解析 缓存 网络协议
中间人攻击之DNS欺骗
【8月更文挑战第13天】
935 2
|
算法 Unix Linux
select函数中的文件描述符(File Descriptor)范围
select函数中的文件描述符(File Descriptor)范围
311 0
select函数中的文件描述符(File Descriptor)范围