2024/4/3作业

looplinklist.h

#ifndef __LOOPLINKLIST__
#define __LOOPLINKLIST__

typedef int datatype;

typedef struct node{
    union{
        datatype text;
        int len;
    }data;
    struct node *next;
}Looplinklist;

Looplinklist *creat_looplinklist();
void insert_head(Looplinklist *head,int num);
void insert_tail(Looplinklist *head,int num);       
void show_looplinklist(Looplinklist *head);
void delete_head(Looplinklist *head);
void delete_tail(Looplinklist *head);
#endif

looplinklist.c

#include "./looplinklist.h"
#include <stdio.h>
#include <stdlib.h>                                                                                       

Looplinklist *creat_looplinklist(){
    Looplinklist *head = (Looplinklist *)malloc(sizeof(Looplinklist));
    if(NULL == head){
        printf("头结点申请失败,链表创建失败\n");
        return NULL;
    }
    head->data.len = 0;
    head->next = head;
    return head;
}

void insert_head(Looplinklist *head,int num){
    Looplinklist *temp = (Looplinklist *)malloc(sizeof(Looplinklist));
    temp->data.text = num;
    temp->next = NULL;
    if(NULL == temp){
        printf("结点申请失败,头插入失败\n");
        return;
    }
    temp->next = head->next;
    head->next = temp;
    head->data.len++;
    return;
}

void insert_tail(Looplinklist *head,int num){
    Looplinklist *temp = (Looplinklist *)malloc(sizeof(Looplinklist));
    temp->data.text = num;
    temp->next = NULL;
    if(NULL == temp){
        printf("结点申请失败,尾插入失败\n");
        return;
    }
    Looplinklist *p = head;
    while(p->next != head)
        p=p->next;
    temp->next = p->next;
    p->next = temp;
    head->data.len++;
    return;
}

void delete_head(Looplinklist *head){
    if(head->next == head){
        printf("头删除失败,删除失败\n");
        return;
    }
    Looplinklist *p=head->next;
    head->next = p->next;
    free(p);
    p = NULL;
    head->data.len--;
    return;
}

void show_looplinklist(Looplinklist *head){
    Looplinklist *p = head ->next;
    if(head==p){
        printf("空链表\n");
        return;
    }
    while(p!=head){
        printf("%d\t",p->data.text);
        p=p->next;
    }
    putchar(10);
    return;
}

void delete_tail(Looplinklist *head){
    Looplinklist *p = head->next;
    if(head==p){
        printf("空链表\n");
        return;
    }
    while(p->next->next != head)
        p=p->next;
    free(p->next->next);
    p->next = head;
    head->data.len--;
    return;
}

main.c

#include <stdio.h>
#include "looplinklist.h"
int main(int argc, const char *argv[])
{
    Looplinklist *head = creat_looplinklist();
    insert_head(head,2);
    insert_head(head,3);
    insert_head(head,4);
    insert_head(head,5);
    insert_head(head,6);
    insert_head(head,7);
    insert_tail(head,1);
    delete_head(head);
    delete_tail(head);
    show_looplinklist(head);
    return 0;
}                                              
                                               

运行结果

约瑟夫问题

+looplinklist

void joseph(Looplinklist *head,int person,int num1,int num2){
    Looplinklist *p=head;
    for(int i=0;i<num1;i++)
            p=p->next;
    for(int j=0;j<person;j++){
        for(int i=0;i<num2-2;i++){
            p=p->next;
            if(p==head)
                p=p->next;
        }
        if(p->next == head)                                            
            p=p->next;
        printf("%d\t",p->next->data.text);
        free(p->next);
        p->next=p->next->next;
        p=p->next;
        head->data.len--;
    }
    putchar(10);
    return;
}

mian.c

#include <stdio.h>
#include "looplinklist.h"
int main(int argc, const char *argv[])
{
    Looplinklist *head = creat_looplinklist();
    printf("总共几个人?\n");
    int person;
    scanf("%d",&person);
    for(int i=0;i<person;i++)
        insert_tail(head,i+1);
    show_looplinklist(head);
    printf("从第几个开始数第几个\n");
    int num1,num2;
    scanf("%d %d",&num1,&num2);
    joseph(head,person,num1,num2);
    return 0;
}                                                     

运行结果

doublelinklist.c

#include <stdio.h>
#include <stdlib.h>
#include "doublelinklist.h"

Doublelinklist *create_doublelinklist(){
    Doublelinklist *head = (Doublelinklist *)malloc(sizeof(Doublelinklist));
    if(NULL==head){                                                                    
        printf("申请空间失败,创建双向链表失败\n");
        return NULL;
    }
    head->next = NULL;
    head->prev = NULL;
    head->data.len = 0;
    return head;
}

void insert_head(Doublelinklist *head,int num){
    Doublelinklist *temp = (Doublelinklist *)malloc(sizeof(Doublelinklist));
    if(NULL==temp){
        printf("申请空间失败,头插入失败\n");
        return;
    }
    temp->next=NULL;
    temp->prev=NULL;
    temp->data.text=num;
    temp->next=head->next;
    head->next=temp;
    if(temp->next!=NULL)
        temp->next->prev=temp;
    temp->prev=head;
    head->data.len++;
    return;
}

void insert_tail(Doublelinklist *head,int num){
    Doublelinklist *p=head;
    Doublelinklist *temp = (Doublelinklist *)malloc(sizeof(Doublelinklist));
    if(NULL==temp){
        printf("申请空间失败,尾插入失败\n");
        return;
    }
    temp->next=NULL;
    temp->prev=NULL;
    temp->data.text=num;

    while(p->next != NULL)
        p=p->next;
    temp->next= p->next;
    p->next=temp;
    temp->prev = p;

    head->data.len++;
    return;
}

void delete_head(Doublelinklist *head){
    if(head->next == NULL){
        printf("空链表\n");
        return;
    }
    Doublelinklist *p = head->next;
    head->next = p->next;
    if(p->next!=NULL)
        p->next->prev=head;
    free(p);
    p=NULL;
    return;
}

void delete_tail(Doublelinklist *head){
    if(head->next==NULL){
        printf("空链表\n");
        return;
    }
    Doublelinklist *p=head;
    while(p->next!=NULL)
        p=p->next;
    p->prev->next=NULL;
    free(p);
    p=NULL;
    return;
}

void insert(Doublelinklist *head,int num,int index){
    Doublelinklist *temp=(Doublelinklist *)malloc(sizeof(Doublelinklist));
    if(temp == NULL){
        printf("空间申请失败,按位插入失败\n");
        return;
    }

    temp->data.text = num;
    temp->next=NULL;
    temp->prev=NULL;

    if(index<1||index>head->data.len+1)
    {
        printf("下标非法\n");
        return;
    }
    Doublelinklist *p=head;
    for(int i = 0;i<index-1;i++)
        p=p->next;
    temp->next=p->next;
    p->next=temp;
    temp->prev=p;
    if(p->next != NULL)
        temp->next->prev=temp;
    head->data.len++;
    return;
}

void delete(Doublelinklist *head,int index){
    if(NULL==head->next){
        printf("空链表\n");
        return;
    }
    if(index<1||index>head->data.len)
    {
        printf("下标非法\n");
        return;
    }
    Doublelinklist *p=head;
    for(int i=0;i<index;i++)
        p=p->next;
    p->prev->next=p->next;

    if(p->next!=NULL)
        p->next->prev=p->prev;

    free(p);
    p=NULL;
    head->data.len--;
    return;
}

void show_doublelinklist(Doublelinklist *head){
    Doublelinklist *p = head;
    if(p->next==NULL){
        printf("空链表\n");
        return;
    }
    while(p->next!=NULL){
        p=p->next;
        printf("%d\n",p->data.text);
    }
    return;

}
                                                                                       

doublelinklist.h

#ifndef __DLINKLIST__
#define __DLINKLIST__

typedef struct node{
    union{
        int text;                                     
        int len;
    }data;
    struct node* next;
    struct node* prev;
}Doublelinklist; 

Doublelinklist *create_doublelinklist();
void insert_head(Doublelinklist* head,int num);
void show_doublelinklist(Doublelinklist*head);
void insert_tail(Doublelinklist* head,int num);
void delete_head(Doublelinklist *head);
void delete_tail(Doublelinklist *head);
void insert(Doublelinklist *head,int num,int index);
void delete(Doublelinklist *head,int index); 
void show_doublelinklist(Doublelinklist *head);
#endif

main.c

#include <stdio.h>
#include "./doublelinklist.h"

int main(int argc, const char *argv[])
{
    Doublelinklist *head = create_doublelinklist();
    insert_head(head,1);
    insert_head(head,2);
    insert_head(head,3);                               
    insert_head(head,4);
    insert_head(head,5);
    insert_head(head,6);
    insert_tail(head,0);
    delete_head(head);
    delete_tail(head);
    insert(head,23,2);
    delete(head,3);
    show_doublelinklist(head);
    return 0;
}

 运行结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值