现有男女学生链表(链表结点中有名字和年龄两个元素):①将 男学生链表 和 女学生链表按年龄从小到大合并,②将合并后的链表逆序排列,③通过年龄能搜索到该年龄的学生的姓名。
#include
#include
#include
#include
#define MAX_SIZE 20
struct student
{
int age;
char name[MAX_SIZE];
struct student* next;
};
typedef struct student Stu;
typedef Stu* Link;
void init(Link* head)
{
*head = (Link)malloc(sizeof(Stu));
(*head)->next = *head;
}
void insert_tail_node(Link head,Link newnode)
{
Link temp = head;
while(temp->next != head)
{
temp = temp->next;
}
temp->next = newnode;
newnode->next = head;
}
void display(Link head)
{
Link temp = head->next;
while(temp != head)
{
printf("%d %s ",temp->age,temp->name);
temp = temp->next;
}
}
int sort_insert(Link head,Link newnode)
{ Link temp = head;
Link front = temp;
temp = temp->next;
while(temp != head)
{
if(temp->age >= newnode->age)
{
newnode->next = front->next;
front->next = newnode;
return 0;
}
front = temp;
temp = temp->next;
}
newnode->next = front->next;
front->next = newnode;
return 0;
}
Link combine_link(Link head1,Link head2)
{
Link head;
Link temp1 = head1->next;
Link temp2 = head2->next;
Link newnode = NULL;
init(&head);
while(temp1 != head1)
{
newnode = (Link)malloc(sizeof(Stu));
newnode->age = temp1->age;
strcpy(newnode->name,temp1->name);
sort_insert(head,newnode);
temp1 = temp1->next;
}
while(temp2 != head2)
{
newnode = (Link)malloc(sizeof(Stu));
newnode->age = temp2->age;
strcpy(newnode->name,temp2->name);
sort_insert(head,newnode);
temp2 = temp2->next;
}
return head;
}
int reverse_link(Link* head)
{
if((*head)->next == NULL || (*head)->next->next == NULL)
{
return 0;
}
else
{
Link p = *head;
Link s = p->next;
Link t = s->next;
while(t != *head)
{
s->next = p;
p = s;
s = t;
t = t->next;
}
s->next = p;
(*head)->next = s;
return 0;
}
}
int search(Link head,int age)
{
Link temp = head;
Link front = temp;
temp = temp->next;
int flag = 0;
while(temp != head)
{
if(temp->age == age)
{
printf("%s\n",temp->name);
flag = 1;
}
temp = temp->next;
}
if(flag == 1)
{
return 0;
}
else
{
temp = head;
front = temp;
temp = temp->next;
while(temp != head)
{
if(age > temp->age)
{
if(fabs(front->age - age) > fabs(temp->age - age))
{
printf("%s\n",temp->name);
return 0;
}
else if(fabs(front->age - age) < fabs(temp->age - age))
{
printf("%s\n",front->name);
return 0;
}
else
{
printf("%s\n",front->name);
printf("%s\n",temp->name);
return 0;
}
}
front = temp;
temp = temp->next;
}
}
return 0;
}
int main()
{
Link b_head;
Link g_head;
Link head;
Link newnode;
init(&b_head);
init(&g_head);
init(&head);
Stu boy[3] = {{11,"caozeren"},{10,"shenyuhui"},{12,"wangrenze"}};
Stu girl[3] = {{19,"zhenchen"},{18,"xuweijuan"},{20,"zhuhuiyu"}};
int i = 0;
for(i = 0; i < 3; i++)
{
newnode = &boy[i];
insert_tail_node(b_head,newnode);
}
for(i = 0; i < 3; i++)
{
newnode = &girl[i];
insert_tail_node(g_head,newnode);
}
display(b_head);
printf("\n");
display(g_head);
printf("\n");
head = combine_link(b_head,g_head);
display(head);
printf("\n");
reverse_link(&head);
display(head);
search(head,17);
return 0;
}