函数题
7-6-1 递增的整数序列链表的插入
接口:
List Insert( List L, ElementType X );
要求实现一个函数,在递增的整数序列链表(带头结点)中插入一个新整数,并保持该序列的有序性。
其中List结构定义如下:
typedef struct Node *PtrToNode; struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */
L是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Insert要将X插入L,并保持该序列的有序性,返回插入后的链表头指针。
List Insert( List L, ElementType X ) { List cur = L; List tmp = (List)malloc(sizeof(struct Node)); tmp->Data = X; while(cur->Next&& cur->Next->Data < X) { cur = cur->Next; } tmp->Next = cur->Next; cur->Next = tmp; return L; }
7-6-2 查找学生链表
学生信息链表结点定义如下:
typedef struct List{ int sno; char sname[10]; List *next; };
需要创建的函数包括:
创建学生信息链表函数:CreateList;
查找学生信息链表函数:Find。
接口:
List * CreateList(); //键盘输入若干学生学号和姓名,学号与姓名以空格符间隔,当输入的学号为-1时,输入结束,创建学生信息链表函数,返回学生链表的头指针。 List * Find(List *head, int no) //在学生信息链表(头指针为head)中查询学号为no的学生,返回该学生结点的指针。
实现:
//键盘输入若干学生学号和姓名,学号与姓名以空格符间隔,当输入的学号为-1时,输入结束, //创建学生信息链表函数,返回学生链表的头指针。 List* BuyList(int sno) { List* newnode = (List*)malloc(sizeof(struct List)); newnode->sno = sno; newnode->next = NULL; return newnode; } List * CreateList() { List *head, *tail; int id; char sname[10] = {0}; tail = head = (List*)malloc(sizeof(List)); head->next = NULL; scanf("%d", &id); while(id != -1) { List* t = BuyList(id); scanf("%s",t->sname); scanf("%d",&id); tail->next = t; tail = t; } scanf("%s",sname); return head; } //在学生信息链表(头指针为head)中查询学号为no的学生,返回该学生结点的指针。 List * Find(List *head, int no) { List* cur = head->next; while(cur) { if(cur->sno == no) return cur; cur = cur->next; } return cur; }
7-6-3 统计专业人数
实现一个函数,统计学生学号链表中专业为计算机的学生人数。链表结点定义如下:
struct ListNode { char code[8]; struct ListNode *next; };
这里学生的学号共7位数字,其中第2、3位是专业编号。计算机专业的编号为02
接口:
int countcs( struct ListNode *head );
其中head是用户传入的学生学号链表的头指针;函数countcs统计并返回head链表中专业为计算机的学生人数。
实现:
int countcs( struct ListNode *head ) { if(head == NULL) return 0; struct ListNode *cur = head; int cnt = 0; while(cur) { if(cur->code[1] == '0' && cur->code[2] == '2') cnt++; cur = cur->next; } return cnt; }
7-6-4 建立学生信息链表
实现一个将输入的学生成绩组织成单向链表的简单函数。
接口:
void input();
该函数利用scanf从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:
struct stud_node { int num; /*学号*/ char name[20]; /*姓名*/ int score; /*成绩*/ struct stud_node *next; /*指向下个结点的指针*/ };
单向链表的头尾指针保存在全局变量head和tail中。
输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。
实现:
struct stud_node* Buynode() { struct stud_node*node = (struct stud_node*)malloc(sizeof(struct stud_node)); node->next = NULL; return node; } void input() { struct stud_node* cur = Buynode(); scanf("%d", &cur->num); while (cur->num != 0) { if (head == NULL) { scanf("%s", cur->name); scanf("%d", &cur->score); head = tail = cur; } else { scanf("%s", cur->name); scanf("%d", &cur->score); tail->next = cur; tail = tail->next; } cur = Buynode(); scanf("%d", &cur->num); } }
编程题
7-7-1 查找书籍
#include <stdio.h> #include <stdlib.h> typedef struct book { double price; char name[40]; struct book* next; }book; book* Buynode() { book* node = (book*)malloc(sizeof(book)); node->next = NULL; return node; } int main() { //输入第一行给出正整数n(<10) int n = 0; scanf("%d", &n); getchar(); book* head, * cur; head = cur = Buynode(); gets(cur->name); scanf("%lf", &cur->price); while (--n)//n本书 { getchar(); book* node = Buynode(); gets(node->name); scanf("%lf", &node->price); cur->next = node; cur = cur->next; } cur = head; double max,min; max = min = cur->price; //选出价格最高、最低 while (cur) { if (cur->price > max) max = cur->price; if (cur->price < min) min = cur->price; cur = cur->next; } cur = head; while (cur->price != max) { cur = cur->next; } printf("%.2lf, %s\n", cur->price, cur->name); cur = head; while (cur->price != min) { cur = cur->next; } printf("%.2lf, %s\n", cur->price, cur->name); return 0; }
7-7-2 找出总分最高的学生
#include <stdio.h> #include <stdlib.h> typedef struct stu { char num[9]; char name[15]; int s1; int s2; int s3; struct stu* next; }stu; stu* Buynode() { stu* node = (stu*)malloc(sizeof(stu)); node->next = NULL; return node; } int main() { int n = 0; scanf("%d", &n); getchar(); stu* cur,* head; cur = head = Buynode(); scanf("%s",head->num); scanf("%s",head->name); scanf("%d%d%d", &head->s1, &head->s2, &head->s3); while (--n) { getchar(); stu* node = Buynode(); scanf("%s",node->num); scanf("%s",node->name); scanf("%d%d%d", &node->s1, &node->s2, &node->s3); cur->next = node; cur = cur->next; } cur = head; int max = cur->s1 + cur->s2 + cur->s3; while (cur) { if ((cur->s1 + cur->s2 + cur->s3) > max) max = cur->s1 + cur->s2 + cur->s3; cur = cur->next; } cur = head; while ((cur->s1 + cur->s2 + cur->s3) != max) { cur = cur->next; } printf("%s %s %d", cur->name, cur->num, cur->s1 + cur->s2 + cur->s3); return 0; }