/*建立一个链表,每个结点包括学号,姓名,性别,年龄*/

/*建立一个链表,每个结点包括学号,姓名,性别,年龄*/
#include <stdio.h>
#include <stdlib.h>
typedef struct information info;
typedef struct information{
 int num;
 char name[10];
 char sex[5];
 int age; 
 info *next;
}info; 
info *Createlist();
info *Deletelist(info *head,int new_age);
int main(){
 info *head=NULL,*p;
 head=Createlist();
 int new_age;
 scanf("%d",&new_age);
 head=Deletelist(head,new_age); 
 for(p=head;p!=NULL;p=p->next){
  printf("%d\t%s\t%s\t%d\n",p->num ,p->name ,p->sex ,p->age );
 }
 return 0;
}
info *Createlist(){
 info *head=NULL,*tail=NULL,*p;
 int x;
 scanf("%d",&x);
 while(x!=0){
  p=(info *)malloc(sizeof(info));
  p->num =x;
  scanf("%s%s%d",p->name ,p->sex ,&p->age );
  p->next=NULL;
  if(head==NULL){
   head=p;
  } else{
   tail->next=p;
  }
  tail=p;
  scanf("%d",&x); 
 } 
 printf("OK!\n"); 
 return head;
}
info *Deletelist(info *head,int new_age){
 info *ptr1,*ptr2;
 while(head!=NULL&&head->age==new_age){
  ptr2=head;
  head=head->next;
  free(ptr2);
 }
 if(head==NULL){
  return NULL;
 }
 ptr1=head;
 ptr2=head->next ;
 while(ptr2!=NULL){
  if(ptr2->age ==new_age){
   ptr1->next =ptr2->next ;//ptr1链接ptr2后一个结点 
   free(ptr2);//删除ptr2所指结点 :不对内容作任何修改,只是标记这块区域,告诉系统可以重新分配 
  }else{
   ptr1=ptr2;
  }
  ptr2=ptr2->next;//ptr2后移一位 
 }
 return head;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要定义一个结构体来表示链表中的每个节点,包括学号姓名性别年龄: ``` struct Node { int id; // 学号 string name; // 姓名 char gender; // 性别 int age; // 年龄 Node* next; // 指向下一个节点的指针 }; ``` 然后,我们可以定义一个函数来创建链表,并在其中插入节点: ``` Node* createList() { Node* head = new Node(); // 创建头节点 head->next = NULL; // 头节点的指针为空 int n; // 输入节点个数 cin >> n; Node* p = head; // 指向当前节点的指针 for (int i = ; i < n; i++) { Node* node = new Node(); // 创建新节点 cin >> node->id >> node->name >> node->gender >> node->age; node->next = NULL; // 新节点的指针为空 p->next = node; // 将新节点插入到链表中 p = node; // 将指针指向新节点 } return head; // 返回头节点 } ``` 接下来,我们可以定义一个函数来删除链表年龄等于给定年龄的节点: ``` void deleteNode(Node* head, int age) { Node* p = head->next; // 指向第一个节点的指针 Node* pre = head; // 指向前一个节点的指针 while (p != NULL) { if (p->age == age) { // 如果节点的年龄等于给定年龄 pre->next = p->next; // 将前一个节点的指针指向下一个节点 delete p; // 删除当前节点 p = pre->next; // 将指针指向下一个节点 } else { pre = p; // 将前一个节点的指针指向当前节点 p = p->next; // 将指针指向下一个节点 } } } ``` 最后,我们可以在主函数中调用以上两个函数来创建链表并删除节点: ``` int main() { Node* head = createList(); // 创建链表 int age; cin >> age; deleteNode(head, age); // 删除节点 Node* p = head->next; // 指向第一个节点的指针 while (p != NULL) { // 遍历链表并输出每个节点的信息 cout << p->id << " " << p->name << " " << p->gender << " " << p->age << endl; p = p->next; } return ; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高达十几个

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值