作业9下

本文介绍了一个使用环形链表解决约瑟夫环问题的C语言程序,以及一个创建、排序和删除学生信息单链表的C语言程序。通过具体的代码示例,展示了如何在环形链表中进行节点的插入和删除操作,以及在单链表中按学号排序和删除特定学生的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值