- 题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.
提示:用环形链表实现
#include <stdio.h>
#include <stdlib.h>
#define MAL_OK 1
#define MAL_ERR 0
struct node
{
int num;
struct node *next;
};
typedef struct node Node;
typedef struct node * Link;
int malloc_ok(Link new_node)
{
if(new_node == NULL)
{
return MAL_ERR;
}
else
{
return MAL_OK;
}
}
void create_node(Link * new_node,int i)
{
(*new_node) = (Link)malloc(sizeof(Node));
while(malloc_ok(*new_node) == MAL_ERR)
{
(*new_node) = (Link)malloc(sizeof(Node));
}
(*new_node)->num = i;
}
void create_link(Link * head)
{
create_node(head,0);
(*head)->next = *head;
}
void insert_node_tail(Link head,Link new_node)
{
Link p;
p = head;
while(p->next != head)
{
p = p->next;
}
p->next = new_node;
new_node->next = head;
}
void node_del(Link head,Link p)
{
Link q;
q = head;
while(q->next != p)
{
q = q->next;
}
q->next = p->next;
free(p);
}
void release_link(Link * head)
{
Link p;
p = (*head)->next;
if(p == *head)
{
printf("link is empty.\n");
free(p);
*head = NULL;
}
else
{
while(p != *head)
{
(*head)->next = p->next;
free(p);
p = (*head)->next;
}
free(*head);
*head = NULL;
}
}
void display(Link head)
{
Link p;
p = head;
if(p == NULL)
{
printf("no link.\n");
}
else if(p->next == head)
{
printf("Link is empty.\n");
}
else
{
while(p->next != head)
{
p = p->next;
printf("num = %d\n",p->num);
}
}
}
int main()
{
Link head = NULL;
Link new_node = NULL;
int i,people;
int num_val,num_loc;
create_link(&head);
printf("Hao many people?\n");
scanf("%d",&people);
for(i = 1; i <= people; i++)
{
create_node(&new_node,i);
insert_node_tail(head,new_node);
}
Link p;
p = head;
i = 1;
while(people > 1)
{
if(p == head)
{
p = p->next;
}
if(i % 3 == 0)
{
node_del(head,p);
people--;
}
p = p->next;
i++;
}
printf("最后一个人的为:\n");
display(head);
release_link(&head);
return 0;
}
2. 题目:创建两个学生链表,含有姓名、年龄的信息,一个链表存放男生,一个链表存放女生
#include <stdio.h>
#include <stdlib.h>
#define MAL_OK 1
#define MAL_ERR 0
struct node
{
int age;
char name[20];
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head) //head为二级指针。
{
*head = NULL;
}
void insert_node_tail(Link *head,Link new_node)
{
Link p;
p = *head;
if(p == NULL)
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
}
int malloc_ok(Link new_node)
{
if(new_node == NULL)
{
return MAL_ERR;
}
else
{
return MAL_OK;
}
}
void create_node(Link * new_node)
{
(*new_node) = (Link) malloc(sizeof(Node)); //创建空间,malloc返回void型指针要进行强类型转换。
while(malloc_ok(*new_node) == MAL_ERR)
{
(*new_node) = (Link) malloc(sizeof(Node));
}
}
void display(Link head)
{
Link p;
p = head;
if(p == NULL)
{
printf("Link is empty!\n");
}
else
{
while(p != NULL)
{
printf("age = %5d\t",p->age);
printf("name = %s\n",p->name);
p = p->next; //指向下一个
}
}
}
void release_link(Link * head)
{
Link p;
p = *head;
if(p == NULL)
{
printf("link is empty!\n");
}
else
{
while(*head != NULL)
{
*head = (*head)->next;
free(p);
p = *head;
}
}
}
int main()
{
Link head1 = NULL; //创建头指针。
Link head2 = NULL;
Link new_node = NULL;//新结点的指针
Link p;
int i;
int man,woman;
create_link(&head1); //创建链表
create_link(&head2); //创建链表
printf("请输入男人的数量。\n");
scanf("%d",&man);
printf("请输入女人的数量。\n");
scanf("%d",&woman);
for(i = 0; i < man; i++)
{
create_node(&new_node);
insert_node_tail(&head1,new_node);
}
for(i = 0; i < woman; i++)
{
create_node(&new_node);
insert_node_tail(&head2,new_node);
}
p = head1;
for(i = 0; i < man; i++)
{
printf("请输入男人年龄。\n");
scanf("%d",&p->age);
printf("请输入男人姓名。\n");
scanf("%s",&p->name);
p = p->next;
}
p = head2;
for(i = 0; i < woman; i++)
{
printf("请输入女人年龄。\n");
scanf("%d",&p->age);
printf("请输入女人姓名。\n");
scanf("%s",&p->name);
p = p->next;
}
printf("man:\n");
display(head1);
printf("woman:\n");
display(head2);
release_link(&head1);
release_link(&head2);
return 0;
}