6.题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,
问最后最后留下的是原来第几号的那位.
提示:用环形链表实现
#include <stdio.h>
#include <stdlib.h>
#define MAN_ERR 0
#define MAN_OK 1
struct node
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * link;
void create_link(link * head)
{
*head = (link)malloc(sizeof(Node));
(*head)->next = *head;
}
int is_malloc_ok(link new_node)
{
if(new_node==NULL)
{
printf("link is empty!\n");
return MAN_ERR;
}
else
{
return MAN_OK;
}
}
void create_node(link * new_node, int i)
{
(*new_node) = (link)malloc(sizeof(Node));
while(is_malloc_ok(*new_node)==MAN_ERR)
{
(*new_node) = (link)malloc(sizeof(Node));
}
(*new_node)->num = i;
}
void insert_node_circle(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 tiren_node(link head,int n)
{
link p, q, temp = NULL;
p = q = head;
int i = 0;
while(p->next != head)
{
if(p == head)
{
q=p;
p=p->next;
}
for(i=1;i<3-1;i++)
{
q=p;
p=p->next;
}
if(p->next == head)
{
q = head;
p = q->next;
printf("%d->",p->num);
temp = p;
p = p->next;
q->next = p;
free(temp);
}
else if(p == head)
{
p = p->next;
printf("%d->",p->next->num);
q = p;
p = p->next;
temp = p;
p = p->next;
free(temp);
q->next = p;
}
else
{
printf("%d->",p->next->num);
q = p;
p = p->next;
temp = p;
p = p->next;
free(temp);
q->next = p;
}
}
if(n%2 == 0)
{
printf("%d\n",q->num);
printf("remain %d\n",q->num);
}
else
{
printf("%d\n",p->num);
printf("remain %d\n",p->num);
}
}
void display_link(link head)
{
link p;
p=head;
if( p == NULL)
{
printf("link is empty!\n");
}
else
{
while(p->next != head)
{
printf("num=%d\n",(p->next)->num);
p=p->next;
}
}
}
void release_link(link * head)
{
link p;
p=*head;
if( p == NULL)
{
printf("link is empty!\n");
}
else
{
p=(*head)->next;
while(p != *head)
{
(*head)->next = p->next;
free(p);
p=(*head)->next;
}
free(p);
*head = NULL;
}
}
int main()
{
link head = NULL;
link new_node = NULL;
int i, n;
create_link(&head);
printf("please input:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
create_node(&new_node,i);
insert_node_circle(head,new_node);
}
display_link(head);
printf("\n\n");
tiren_node(head,n);
display_link(head);
printf("\n");
release_link(&head);
display_link(head);
return 0;
}
7.题目:创建一个学生学号及姓名的单链表,即节点包括学生学号、姓名及指向下一个节点的指针,链表按学生的学号排列。
再从键盘输入某一学生姓名,将其从链表中删除。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
char name[20];
char id[15];
struct node *next;
};
typedef struct node Node;
typedef struct node *link;
void create_link(link * head)
{
link p, q;
int i;
*head = (link)malloc(sizeof(Node));
q = *head;
p = NULL ;
printf("1 or 0?\n");
scanf("%d",&i);
getchar();
while(i)
{
p=(link)malloc(sizeof(Node));
printf("请输入学生姓名:\n");
gets(p->name);
printf("请输入学生学号:\n");
gets(p->id);
q->next = p;
q = p;
scanf("%d",&i);
getchar();
}
q->next = NULL;
}
void delete_node(link head)
{
link p, q;
q=p=head;
char name[20];
printf("请输入要删除的学生姓名:\n");
gets(name);
getchar();
if(p == NULL)
{
printf("link is empty!\n");
}
else
{
p = head->next;
while( p != NULL)
{
if(strcmp(name,p->name)==0)
{
break;
}
else
{
q=p;
p=p->next;
}
}
if(p != NULL)
{
q->next = p->next;
free(p);
printf("删除成功!\n");
}
else
{
printf("查无此人,没法删除!\n");
}
}
}
void bubble_sort_node(link head)
{
link p;
p = head;
if(p == NULL )
{
return ;
}
p = head->next;
if(p == NULL)
{
return ;
}
if(p->next == NULL)
{
return ;
}
link p1, p2, p3, temp, end = NULL;
while(head->next != end)
{
for(p1=head,p2=p1->next,p3=p2->next;p3!=end;p1=p1->next,p2=p2->next,p3=p3->next)
{
if(strcmp(p2->id , p3->id)>0)
{
p2->next = p3->next;
p1->next = p3;
p3->next = p2;
temp = p3;
p3 = p2;
p2 = temp;
}
}
end = p2;
}
}
void display_link(link head)
{
link p;
p = head;
if(p == NULL)
{
printf("link is empty!\n");
}
else
{
p = head->next;
while(p != NULL)
{
printf("姓名:%s\t学号:%s\t\n",p->name,p->id);
p = p->next;
}
}
}
void release_link(link * head)
{
link p, q;
p = q = *head;
if(p == NULL)
{
printf("link is empty!\n");
}
else
{
p = p->next;
while( p != NULL)
{
q->next = p->next;
free(p);
p = p->next;
}
free(p);
*head = NULL;
}
}
int main()
{
link head = NULL;
create_link(&head);
display_link(head);
printf("\n");
delete_node(head);
display_link(head);
printf("\n");
bubble_sort_node(head);
display_link(head);
printf("\n");
release_link(&head);
display_link(head);
return 0;
}