题目(数据结构测试)
代码:
#include<stdio.h> #include<malloc.h> #include<string.h> #define MAX 50 /*创建一个学生表结构体*/ typedef struct student_node { unsigned id; char name[MAX]; char sex[MAX]; char major[MAX]; struct student_node *next; }Slink; /*创建一个有n个学生带头结点的单链表*/ Slink *CreateSlink(int n) { Slink *head,*p,*s; int i; p = head = (Slink *)malloc(sizeof(Slink)); //创建头结点 printf("请输入%d个学生的学籍信息:\n",n); for(i = 0;i < n;i++) { s = (Slink *)malloc(sizeof(Slink)); printf("**********请输入学号**********\n"); scanf("%u",&s->id); printf("**********请输入姓名**********\n"); getchar(); //消除scanf函数不接收的 回车符(\n) gets(s->name); //name中可以包含空格 printf("**********请输入性别**********\n"); scanf("%s",&s->sex); printf("**********请输入专业**********\n"); scanf("%s",&s->major); p->next = s; //将新结点s插入链表的尾结点 p = s; //修改尾指针指向 p 指向当前的尾结点 s } p->next = NULL; return head; } /*在单链表中按照学号顺序重新调整结点的顺序,形成一个新的链表*/ void BubbleSort(Slink *head) { Slink *firstNode = head->next; Slink *secondNode = head; char temp[1024]; while(firstNode != NULL) { while(firstNode->next != NULL) { if(firstNode->id > firstNode->next->id) { int t = firstNode->id; firstNode->id = firstNode->next->id; firstNode->next->id = t; //交换姓名 strcpy(temp,firstNode->name); strcpy(firstNode->name,firstNode->next->name); strcpy(firstNode->next->name,temp); //交换性别 strcpy(temp,firstNode->sex); strcpy(firstNode->sex,firstNode->next->sex); strcpy(firstNode->next->sex,temp); //交换专业 strcpy(temp,firstNode->major); strcpy(firstNode->major,firstNode->next->major); strcpy(firstNode->next->major,temp); } firstNode = firstNode->next; } firstNode = secondNode->next; secondNode = firstNode; } } /*输出按学号从小到大排序后的结果*/ void display(Slink *head) { Slink *p; p = head->next; /*从第一个实际结点开始*/ if(!p) { printf("\n带头结点的单链表是空的!"); } else { printf("\n新生登记卡按学号排序后的表为:\n"); while(p) { printf("%u %s %s %s\n",p->id,p->name,p->sex,p->major); p = p->next; } } } int main() { Slink *head = CreateSlink(3); BubbleSort(head); display(head); }
运行结果