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

#include <stdio.h>
#include <malloc.h>
#define LEN sizeof(struct  student)
struct  student
{  char num[6];
   char name[8];
   char sex[2];
   int age;
   struct student *next;
} stu[10];

int main()
{ struct student *p,*pt,*head;
  int i,length,iage,flag=1;
  int find=0;            //找到待删除元素 find=1,否则find=0
  while (flag==1)
   {printf("input length of list(<10):");
    scanf("%d",&length);
    if (length<10)
      flag=0;
   }

    //建立链表 
  for (i=0;i<length;i++)
     {p=(struct student *) malloc(LEN);
      if (i==0)
     head=pt=p;
      else
     pt->next=p;
      pt=p;
      printf("NO.:");
      scanf("%s",p->num);
      printf("name:");
      scanf("%s",p->name);
      printf("sex:");
      scanf("%s",p->sex);
      printf("age:");
      scanf("%d",&p->age);
    }
  p->next=NULL;
  p=head;
  printf("\n NO.    name    sex  age\n");      //显示  
  while(p!=NULL)
     {printf("%4s%8s%6s%6d\n",p->num,p->name,p->sex,p->age);
      p=p->next;
     }

    //  删除  
  printf("input age:");          //输入待删年龄  
  scanf("%d",&iage);
  pt=head;
  p=pt;
  if (pt->age==iage)           //如果链头是待删元素
    {p=pt->next;
     head=pt=p;
     find=1;
    }
  else                       
    pt=pt->next;
  while (pt!=NULL)
    {if (pt->age==iage)
      {p->next=pt->next;
       find=1;
      }
     else                      // 中间结点不是待删元素
       p=pt;
     pt=pt->next;
    }
  if (!find)
    printf(" not found  %d.",iage);

  p=head;
  printf("\n NO.    name    sex  age\n"); //显示结果
  while (p!=NULL)
    {printf("%4s%8s",p->num,p->name);
     printf("%6s%6d\n",p->sex,p->age);
     p=p->next;
    }
  return 0;
}

  • 3
    点赞
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值