1277 - C语言11.13
建立一个链表,每个节点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的节点所包含的年龄等于这个年龄,则将所有符合要求的节点删去。
Input
第一行有一个整数n,表示链表中的节点个数。保证n不超过100。
之后的n行每行有4个用空格隔开的部分,分别为学号(正整数)、姓名(长度不超过20且不包含空格的字符串)、性别(字符m或f)、年龄(正整数)。
最后一行有一个整数age,表示需要删除的节点年龄。
Output
首先输出链表最终剩下的节点个数k。
在接下来的k行,每行输出4个用空格隔开的部分,分别为学号、姓名、性别和年龄,与输入格式相同。
请注意行尾输出换行。
Examples
Input
5 101 Aaa m 25 102 Bbb f 26 103 Ccc m 26 104 Ddd f 24 105 Eee m 25 26
Output
3 101 Aaa m 25 104 Ddd f 24 105 Eee m 25
Solution C
#include <stdio.h> typedef struct student{ int id; char name[20]; char sex[2]; int age; int flag; }student; int main(){ int n,i,tmp,cnt; student st[100]; // freopen("1.txt","r",stdin); while (scanf("%d",&n)==1) { for (i=0;i<n;i++) { scanf("%d %s %s %d",&(st[i].id),st[i].name,st[i].sex,&(st[i].age)); st[i].flag=1; } scanf("%d",&tmp); cnt=n; for (i=0;i<n;i++) { if (st[i].age==tmp) { st[i].flag=0; cnt--; } } printf("%d\n",cnt); for (i=0;i<n;i++) { if (st[i].flag) { printf("%d %s %s %d\n",st[i].id,st[i].name,st[i].sex,st[i].age); } } } // fclose(stdin); return 0; }
Solution C++
#include <stdio.h> #include <stdlib.h> struct node { int num; char name[21], sex; int age; struct node * next; }; int main() { struct node *head, *tail, *p, *pa; int n, i, del_age; scanf("%d", &n); /* 读入链表中的n个人的信息 */ head = tail = NULL; for (i = 0;i < n;i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%d %s %c %d", &p->num, p->name, &p->sex, &p->age); if (head == NULL) { head = tail = p; } else { tail->next = p; tail = p; } } tail->next = NULL; scanf("%d", &del_age); /* 遍历链表的每一个节点,判断节点的年龄是否与要删除的相等 */ pa = p = head; while (pa != NULL) { if (pa->age == del_age) { if (pa == head) { head = pa->next; free(pa); pa = p = head; } else { p->next = pa->next; free(pa); pa = p->next; } n--; } else { p = pa; pa = pa->next; } } /* 将处理后的链表进行输出 */ printf("%d\n", n); p = head; while (p != NULL) { printf("%d %s %c %d\n", p->num, p->name, p->sex, p->age); p = p->next; } return 0; }