建立一个包含5个结点的链表,每个结点包括学号、姓名、年龄。输入一个学号,查找链表,如果链表中的结点所包含的学号等于输入学号,则将此结点删去。

本文详细介绍了单链表的基本操作,包括创建、遍历及删除节点。通过具体实例,讲解了如何实现一个单循环链表,并演示了删除特定学号的学生信息的过程。适合初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在即将睡觉的时候,以前一个学弟突然来找我问题目,看了一眼,是比较基础的链表,但是又因为刚刚接触数据结构,所以很难理解,于是从床上爬起来花了半小时写了这篇文章,将原本的函数均写进了main里面,或许可以使“新手”方便理解。
(这篇代码还有待精简提高,只是本人困了… 😄)

第一篇文章,不知道咋样…人生嘛,总有第一次的,要勇于尝试。

 #include <stdio.h>   
 #include <malloc.h>  /* malloc()等 */
 #define OK    1
 #define TRUE  1
 #define FALSE 0
 #define ERROR 0
 
 typedef int ElemType;
 
 /* 线性表的单链表存储结构 */
 typedef struct LNode
 {
   ElemType     num;
   ElemType     age;
   char         name;
   struct LNode *next;
 } LNode,  *LinkList; 
 
 int main()
 { 
   LinkList L,head;
   int i,num_temp;
   L=(LinkList)malloc(sizeof(struct LNode));
   head=L;
   LinkList t=L,s,p;   //t指向头结点 
   for(i=0;i<3;i++){
     p=(LinkList)malloc(sizeof(struct LNode));
     printf("请输入学号、姓名、年龄:\n");
     scanf("%d%s%d",&t->num,&t->name,&t->age);
     t->next=p;
     if(i==2) t->next=head;
     t=t->next;  //t仍旧是头指针 
	}//建立一个单循环链表 
	
	printf("请输入要删除的学号:\n");
    scanf("%d",&num_temp);

   LinkList a=head;
   printf("删除学号前:"); 
   while(a->next!=head)
   {
     printf("%d ",a->num);
     printf("%c ",a->name);
     printf("%d ",a->age);
     a=a->next;
   }
   printf("%d ",a->num);   //输出的是最开始的数据 
     printf("%c ",a->name);
     printf("%d ",a->age);
   //输出删除学号前的链表 
   a=head;
   while(a->next->num!=num_temp){
   	a=a->next;
   }
   a->next=a->next->next;
   a=L;
   printf("删除学号后:") ;
   while(a->next!=head)
   {
     printf("%d ",a->num);
     printf("%c ",a->name);
     printf("%d ",a->age);
     a=a->next;
   }
   printf("%d ",a->num);   
     printf("%c ",a->name);
     printf("%d ",a->age);
}

结果运行图 此代码只由三个学生,可自行更改人数
此代码只有三个学生,可自行更改人数

创建一个链表结构,用于存储学生的相关信息,每个节点可以包含学号姓名、性别和年龄四个字段,可以按照以下步骤来实现: 1. 定义一个Node类,它有一个数据域(例如`StudentInfo`对象)和两个指针,一个是下一个节点(`next`),另一个可能是上一个节点(`prev`),如果是头节点则`prev`为null。 ```java class Node { StudentInfo student; Node prev, next; // 构造函数 public Node(StudentInfo info) { student = info; prev = null; next = null; } } ``` 2. 定义`StudentInfo`类,包含学号姓名、性别和年龄属性。 ```java class StudentInfo { int id; String name; char gender; int age; // 构造函数 public StudentInfo(int id, String name, char gender, int age) { this.id = id; this.name = name; this.gender = gender; this.age = age; } } ``` 3. 创建链表类`StudentList`,维护一个节点`head`,并提供添加节点查找特定年龄节点以及删除节点的方法。 ```java class StudentList { private Node head; // 添加节点方法 public void add(StudentInfo student) { Node newNode = new Node(student); if (head == null) { head = newNode; } else { Node current = head; while (current.next != null && current.next.student.age != student.age) { current = current.next; } if (current.next != null && current.next.student.age == student.age) { current.next = newNode; newNode.prev = current; } else { newNode.next = current.next; if (newNode.next != null) { newNode.next.prev = newNode; } current.next = newNode; } } } // 删除节点方法 public void removeByAge(int targetAge) { if (head == null) return; Node current = head; while (current != null) { if (current.student.age == targetAge) { if (current.prev != null) { current.prev.next = current.next; } else { // 如果是头节点 head = current.next; } if (current.next != null) { current.next.prev = current.prev; } current = current.next; // 跳过已删除的节点 } else { current = current.next; } } } } // 使用示例 StudentList list = new StudentList(); // 添加节点... int targetAge = 20; list.removeByAge(targetAge); // 删除所有年龄为20岁的节点 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值