2024.2.3

本文详细介绍了如何使用C语言实现单向循环链表的创建、头部插入、删除(包括头和尾)、以及约瑟夫环算法,最后展示了链表的排序功能。
摘要由CSDN通过智能技术生成

1.请编程实现单向循环链表的头插、头删、尾插、尾删

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 typedef int datatype;
  5 typedef struct Node
  6 {
  7     datatype data;//数据域
  8     struct Node *next;//指针域
  9 }*Linklist;
 10 Linklist create();
 11 Linklist insert_head(Linklist head,datatype element);
 12 void output(Linklist head);
 13 Linklist insert_rear(Linklist head,datatype element);
 14 Linklist delete_head(Linklist head);
 15 Linklist delete_rear(Linklist head);
 16 int main(int argc, const char *argv[])
 17 {
 18     Linklist head=NULL;//定义单向循环链表头指针
 19     int n;
 20     printf("please enter n:");
 21     scanf("%d",&n);
 22     datatype element;
 23 /*  //头插
 24     for(int i=0;i<n;i++)
 25     {
 26         printf("please enter %d element:",i+1);
 27         scanf("%d",&element);
 28         head=insert_head(head,element);
 29     }
 30     //遍历
 31     output(head);*/
 32     //尾插
 33     for(int i=0;i<n;i++)
 34     {
 35         printf("please enter %d element:",i+1);
 36         scanf("%d",&element);
 37         head=insert_rear(head,element);
 38     }
 39     output(head);
 40     //头删
 41     head=delete_head(head);
 42     output(head);
 43     //尾删
 44     head=delete_rear(head);
 45     output(head);
 46     return 0;
 47 }
 48 //创建节点s
 49 Linklist create()
 50 {
 51     Linklist s=(Linklist)malloc(sizeof(struct Node));
 52     if(NULL==s)
 53         return NULL;
 54     s->data=0;
 55     s->next=s;
 56     return s;
 57 }
 58 //头插
 59 Linklist insert_head(Linklist head,datatype element)
 60 {
 61     Linklist s=create();
 62     s->data=element;
 63     if(NULL==head)
 64         head=s;
 65     else
 66     {
 67         Linklist p=head;
 68         while(p->next!=head)
 69             p=p->next;
 70         s->next=head;
 71         head=s;
 72         p->next=head;
 73     }
 74     return head;
 75 }
 76 //遍历
 77 void output(Linklist head)
 78 {
 79     if(NULL==head)
 80     {
 81         puts("empty");
 82         return;
 83     }
 84     Linklist p=head;
 85     do
 86     {
 87         printf("%-4d",p->data);
 88         p=p->next;
 89     }while(p!=head);
 90     puts("");
 91 }
 92 //尾插
 93 Linklist insert_rear(Linklist head,datatype element)
 94 {
 95     Linklist s=create();
 96     s->data=element;
 97     if(NULL==head)
 98         head=s;
 99     else
100     {
101         Linklist p=head;
102         while(p->next!=head)
103             p=p->next;
104         p->next=s;
105         s->next=head;
106     }
107     return head;
108 }
109 //头删
110 Linklist delete_head(Linklist head)
111 {
112     if(NULL==head)
113         return head;
114     else
115     {
116         Linklist p=head;
117         while(p->next!=head)
118             p=p->next;
119         Linklist del=head;
120         head=head->next;
121         free(del);del=NULL;
122         p->next=head;
123     }
124     return head;
125 }
126 //尾删
127 Linklist delete_rear(Linklist head)
128 {
129     if(NULL==head)
130     {
131         puts("empty");
132         return head;
133     }
134     else if(head==head->next)
135     {
136         free(head);
137         head=NULL;
138         return head;
139     }
140     else
141     {
142         Linklist del=head;
143         while(del->next->next!=head)
144             del=del->next;
145         free(del->next);
146         del->next=head;
147         return head;
148     }
149 
150 }      

效果显示:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 typedef int datatype;
  5 typedef struct Node
  6 {
  7     datatype data;//数据域
  8     struct Node *next;//指针域
  9 }*Linklist;
 10 Linklist create();
 11 Linklist insert_head(Linklist head,datatype element);
 12 void output(Linklist head);
 13 Linklist insert_rear(Linklist head,datatype element);
 14 Linklist delete_head(Linklist head);
 15 Linklist delete_rear(Linklist head);
 16 Linklist john(Linklist head,int n,int m);
 17 int main(int argc, const char *argv[])
 18 {
 19     Linklist head=NULL;//定义单向循环链表头指针
 20     int n;
 21     printf("please enter n:");
 22     scanf("%d",&n);
 23     datatype element;
 24 /*  //头插
 25     for(int i=0;i<n;i++)
 26     {
 27         printf("please enter %d element:",i+1);
 28         scanf("%d",&element);
 29         head=insert_head(head,element);
 30     }
 31     //遍历
 32     output(head);*/
 33     //尾插
 34     for(int i=0;i<n;i++)
 35     {
 36         printf("please enter %d element:",i+1);
 37         scanf("%d",&element);
 38         head=insert_rear(head,element);
 39     }
 40     output(head);
 41 /*  //头删
 42     head=delete_head(head);
 43     output(head);
 44     //尾删
 45     head=delete_rear(head);
 46     output(head);*/
 47     //约瑟夫环
 48     int m;
 49     printf("please enter m:");
 50     scanf("%d",&m);
 51     head=john(head,n,m);
 52     puts("");
 53     return 0;
 54 }
 55 //创建节点s
 56 Linklist create()
 57 {
 58     Linklist s=(Linklist)malloc(sizeof(struct Node));
 59     if(NULL==s)
 60         return NULL;
 61     s->data=0;
 62     s->next=s;
 63     return s;
 64 }
 65 //头插
 66 Linklist insert_head(Linklist head,datatype element)
 67 {
 68     Linklist s=create();
 69     s->data=element;
 70     if(NULL==head)
 71         head=s;
 72     else
 73     {
 74         Linklist p=head;
 75         while(p->next!=head)
 76             p=p->next;
 77         s->next=head;
 78         head=s;
 79         p->next=head;
 80     }
 81     return head;
 82 }
 83 //遍历
 84 void output(Linklist head)
 85 {
 86     if(NULL==head)
 87     {
 88         puts("empty");
 89         return;
 90     }
 91     Linklist p=head;
 92     do
 93     {
 94         printf("%-4d",p->data);
 95         p=p->next;
 96     }while(p!=head);
 97     puts("");
 98 }
 99 //尾插
100 Linklist insert_rear(Linklist head,datatype element)
101 {
102     Linklist s=create();
103     s->data=element;
104     if(NULL==head)
105         head=s;
106     else
107     {
108         Linklist p=head;
109         while(p->next!=head)
110             p=p->next;
111         p->next=s;
112         s->next=head;
113     }
114     return head;
115 }
116 //头删
117 Linklist delete_head(Linklist head)
118 {
119     if(NULL==head)
120         return head;
121     else
122     {
123         Linklist p=head;
124         while(p->next!=head)
125             p=p->next;
126         Linklist del=head;
127         head=head->next;
128         free(del);del=NULL;
129         p->next=head;
130     }
131     return head;
132 }
133 //尾删
134 Linklist delete_rear(Linklist head)
135 {
136     if(NULL==head)
137     {
138         puts("empty");
139 Linklist john(Linklist head,int n,int m)
140         return head;
141     }
142     else if(head==head->next)
143     {
144         free(head);
145         head=NULL;
146         return head;
147     }
148     else
149     {
150         Linklist del=head;
151         while(del->next->next!=head)
152             del=del->next;
153         free(del->next);
154         del->next=head;
155         return head;
156     }
157 
158 }
159 //约瑟夫环
160 Linklist john(Linklist head,int n,int m)
161 {   
162     if(NULL==head)
163         return head;
164     Linklist p=head;
165     for(int i=0;i<n;i++)
166     {
167         for(int j=0;j<m-2;j++)
168             p=p->next;
169         Linklist del=p->next;
170         printf("%-4d",del->data);
171         p->next=del->next;
172         free(del);del=NULL;
173         p=p->next;
174     }
175     return NULL;
176 }                      

效果显示:

3.请用编程实现单向循环链表的排序

#include <stdio.h>
#include <stdlib.h>
 
typedef int datatype;
typedef struct Node
{
    datatype data;
    struct Node* next;
} *sqlist;
 
sqlist create_node()
{
    sqlist node = (sqlist)malloc(sizeof(struct Node));
 
    if (NULL == node)
    {
        return NULL;
    }
 
    node->next = NULL;
    return node;
}
 
sqlist head_insert(sqlist head, datatype element)
{
    sqlist p = create_node();
    if (NULL == p)
    {
        puts("头插:头插失败");
        return head;
    }
 
    printf("头插:%d\n", element);
    p->data = element;
    if (NULL == head)
    {
        head = p;
        head->next = head;
    }
    else
    {
        sqlist q = head;
        while (q->next != head)
        {
            q = q->next;
        }
        p->next = head;
        head = p;
        q->next = head;
    }
 
    return head;
}
 
sqlist head_delete(sqlist head)
{
    if (NULL == head)
    {
        puts("头删:空链表");
        return NULL;
    }
 
    
    if (head == head->next)
    {
        printf("头删:%d\n", head->data);
        free(head);
        head = NULL;
        return head;
    }
 
    sqlist p = head;
    while (p->next != head)
    {
        p = p->next;
    }
 
    sqlist q = head;
    head = head->next;
    p->next = head;
    printf("头删:%d\n", q->data);
    free(q);
    q = NULL;
 
    return head;
}
 
sqlist tail_insert(sqlist head, datatype element)
{
    sqlist p = create_node();
    if (NULL == p)
    {
        puts("尾插:尾插失败");
        return head;
    }
 
    printf("尾插:%d\n", element);
    p->data = element;
 
    if (NULL == head)
    {
        head = p;
        head->next = head;
        return head;
    }
 
    sqlist q = head;
    while (q->next != head)
    {
        q = q->next;
    }
    q->next = p;
    p->next = head;
 
    return head;
}
 
sqlist tail_delete(sqlist head)
{
    if (NULL == head)
    {
        puts("尾删:空链表");
        return NULL;
    }
 
    if (head == head->next)
    {
        printf("尾删:%d\n", head->data);
        free(head);
        head = NULL;
        return head;
    }
 
    sqlist p = head;
    while (p->next->next != head)
    {
        p = p->next;
    }
    sqlist q = p->next;
    p->next = head;
    printf("尾删:%d\n", q->data);
    free(q);
    q = NULL;
 
    return head;
}
 
void show(sqlist head)
{
    if (NULL == head)
    {
        puts("空链表");
        return;
    }
 
    sqlist p = head;
    printf("展示:");
    do
    {
        printf("%2d", p->data);
        p = p->next;
    }
    while (p != head);
    puts("");
}
 
void sort(sqlist head)
{
    if (NULL == head)
    {
        puts("展示:空链表");
        return;
    }
 
    if (head == head->next)
    {
        return;
    }
 
    for (sqlist p = head; p->next != head; p = p->next)
    {
        for (sqlist q = p->next; q != head; q = q->next)
        {
            if (p->data > q->data)
            {
                p->data += q->data;
                q->data = p->data - q->data;
                p->data -= q->data;
            }
        }
    }
}
 
int main()
{
    int n;
    scanf("%d", &n);
 
    sqlist head = NULL;
    int element;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &element);
        head = head_insert(head, element);
    }
    show(head);
 
    sort(head);
    show(head);
 
    return 0;
}

效果显示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值