2y21号

本文详细介绍了在C语言中如何实现单向循环链表和双向链表的操作,包括创建链表、头插、尾插、头删、尾删以及遍历链表。
摘要由CSDN通过智能技术生成

单向循环链表

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

//创建的单向循环链表
LINK* creat_LINK()
{
    LINK *MY_LINK=(LINK*)malloc(sizeof(LINK));
    if(MY_LINK==NULL)
    {
        printf("创建失败\n");
        return NULL;

    }
    MY_LINK->text.len=0;
    MY_LINK->NEXT=MY_LINK;
    return MY_LINK;
}
//头插
void insert_head(LINK*MY_LINK,typdata num)
{
    LINK* temp=(LINK*)malloc(sizeof(LINK));
    if(temp==NULL)
    {
        printf("创建失败");
        return ;
    }
    //初始化
    temp->text.data=num;
    temp->NEXT=NULL;
    //链接节点
    temp->NEXT=MY_LINK->NEXT;
    MY_LINK->NEXT=temp;

    MY_LINK->text.len++;
}
//尾插
void insert_end(LINK*MY_LINK,typdata num)
{
    LINK*temp=(LINK*)malloc(sizeof(LINK));
    if(temp==NULL)
    {
        printf("尾插失败");
        return;
    }
    temp->text.data=num;
    temp->NEXT=NULL;
    //链接尾部
    LINK*P=MY_LINK;
    while(P->NEXT!=MY_LINK)
    {
        P=P->NEXT;
    }
    temp->NEXT=P->NEXT;
    P->NEXT=temp;

    MY_LINK->text.len++;
}
//头删
void delet_head(LINK*MY_LINK)
{
    if(MY_LINK->NEXT==MY_LINK)
    {
        printf("链表为空,头删失败\n");
        return;
    }
    LINK*P=MY_LINK->NEXT->NEXT;
    LINK*q=MY_LINK->NEXT;
    MY_LINK->NEXT=P;
    free(q);
    MY_LINK->text.len--;
    q=NULL;

}
//尾删
void delet_end(LINK*MY_LINK)
{
    if(MY_LINK->NEXT==NULL)
    {
        printf("尾删失败\n");
        return;
    }
    LINK*P=MY_LINK;
    while(P->NEXT->NEXT!=MY_LINK)
    {
        P=P->NEXT;

    }
    free(P->NEXT);

    P->NEXT=MY_LINK;
    MY_LINK->text.len--;


}
//遍历数组
void read_data(LINK*MY_LINK)
{
    LINK*P=MY_LINK;
    while(P->NEXT!=MY_LINK)
    {
        P=P->NEXT;
        printf("%d ",P->text.data);
    }
    printf("\n");
    printf("链表个数是%d\n",MY_LINK->text.len);
}                                                       
                                                        

双向链表

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include"doubleday2.h"
  4 
  5 //创建带头结点的单链表
  6 LINK* creat_LINK()
  7 {
  8     LINK *MY_LINK=(LINK*)malloc(sizeof(LINK));
  9     if(MY_LINK==NULL)
 10     {
 11         printf("创建失败\n");
 12         return NULL;
 13 
 14     }
 15     MY_LINK->text.len=0;
 16     MY_LINK->NEXT=NULL;
 17     MY_LINK->prev=NULL;
 18     return MY_LINK;
 19 }
 20 
 21 //头插法
 22 void head_inster(LINK* MY_LINK,typdata num)
 23 {
 24     LINK*temp1=(LINK*)malloc(sizeof(LINK));
 25     if(NULL==temp1)
 26     {
 27         printf("头插创建失败\n");
 28         return;
 29     }
 30     //初始化                                                    
 31     temp1->text.data=num;
 32     temp1->NEXT=NULL;
 33     temp1->prev=NULL;
 34 
 35     //链接头节点
 36 
 37     if(MY_LINK->NEXT==NULL)//链表为空时
 38     {
 39         temp1->NEXT=MY_LINK->NEXT;
 40         MY_LINK->NEXT=temp1;
 41         temp1->prev=MY_LINK;
 42     }
 43     else
 44     {
 45         temp1->NEXT=MY_LINK->NEXT;
 46         MY_LINK->NEXT=temp1;
 47         temp1->NEXT->prev=temp1;
 48         temp1->prev=MY_LINK;
 49     }
 50 
 51     //更新长度
 52     MY_LINK->text.len++;
 53 
 54 }
 55 //尾部插入
 56 void end_data(LINK*MY_LINK,typdata num)
 57 {
 58     LINK *P=MY_LINK;
 59 
 60 
 61     while(NULL!=P->NEXT)
 62     {
 63         P=P->NEXT;
 64     }
 65 
 66 
 67     LINK*temp1=(LINK*)malloc(sizeof(LINK));
 68     if(NULL==temp1)
 69     {
 70         printf("尾插创建失败\n");
 71         return;
 72     }
 73     //初始化
 74     temp1->text.data=num;
 75     temp1->prev==NULL;
 76     temp1->NEXT=NULL;
 77 
 78     //链接上一个节点
 79     if(MY_LINK->NEXT==NULL)//链表为空时  
 80     {
 81         temp1->NEXT=MY_LINK->NEXT;
 82         MY_LINK->NEXT=temp1;
 83         temp1->prev=MY_LINK;
 84     }
 85     else
 86     {
 87 
 88         temp1->NEXT=P->NEXT;
 89 
 90         P->NEXT=temp1;
 91         temp1->prev= P;
 92     }
 93 
 94     //更新长度
 95     MY_LINK->text.len++;
 96 
 97 
 98 }
 99 //按位置插入
100 void inster_xb(LINK*MY_LINK,typdata num,int n)
101 {
102     LINK*temp1=(LINK*)malloc(sizeof(LINK));
103     if(NULL==temp1)
104     {
105         printf("头插创建失败\n");
106         return;
107     }
108     //初始化                                
109     temp1->text.data=num;
110     temp1->NEXT=NULL;
111     temp1->prev=NULL;
112     LINK*P=MY_LINK;
113 
114 
115     for(int i=0;i<n-1;i++)
116     {
117         P=P->NEXT;
118     }
119 
120     if(P->NEXT==NULL)
121     {
122         temp1->NEXT=P->NEXT;
123         P->NEXT=temp1;
124         temp1->prev=P;
125     }
126 
127     else
128     {
129 
130         temp1->NEXT=P->NEXT;
131         P->NEXT=temp1;
132 
133         temp1->NEXT->prev=temp1;
134         temp1->prev=P;
135     }
136 
137     MY_LINK->text.len++;
138 
139 
140 }
141 
142 //获取数据
143 void read_date(LINK* MY_LINK)
144 {
145     LINK *P=MY_LINK;
146 
147 
148     while(NULL!=P->NEXT)
149     {
150         P=P->NEXT;
151         printf("%d ",P->text.data);
152     }
153 
154     printf("\n");
155     printf("数据长度是%d\n",MY_LINK->text.len);
156 }
157 
158 //头部删除
159 void delet_head(LINK*MY_LINK)
160 {
161     if(MY_LINK->text.len==0)
162     {
163         printf("链表为空");
164         return;
165     }
166     LINK *P=MY_LINK;
167 
168     if(P->NEXT==NULL)
169     {
170         MY_LINK->NEXT=P->NEXT;
171         free(P);
172         P=NULL;
173 
174     }
175     else{
176         P=P->NEXT;
177         MY_LINK->NEXT=P->NEXT;
178         P->prev=MY_LINK;
179 
180 
181         free(P);
182         P=NULL;
183     }   MY_LINK->text.len--;
184 
185 
186 }
187 //从尾部删除
188 void delet_end(LINK*MY_LINK)
189 {
190     if(MY_LINK->NEXT==NULL)
191     {
192         printf("链表为空");
193         return;
194     }
195     LINK*P=MY_LINK;
196 
197     while(NULL!=P->NEXT)
198     {
199 
200         P=P->NEXT;
201 
202     }
203 
204     P->prev->NEXT=P->NEXT;
205 
206     free(P);
207     P=NULL;
208     MY_LINK->text.len--;
209 
210 }
211 //指定位置删除
212 void delet_WZ(LINK*MY_LINK,int n)
213 {
214 
215     if(MY_LINK->NEXT==NULL)   
216     {                         
217         printf("链表为空");   
218         return;               
219     }                         
220     LINK*P=MY_LINK;  
221 
222     for(int i=0;i<n;i++)
223     {
224         P=P->NEXT;
225     }
226     if(P->NEXT==NULL)
227     {
228         P->prev->NEXT=P->NEXT;
229         free(P);
230         P=NULL;
231     }
232 
233     else
234     {
235     
236         P->prev->NEXT=P->NEXT;
237         P->NEXT->prev=P->prev;
238         free(P);
239         P=NULL;
240     }
241 
242     MY_LINK->text.len--;
243 
244 
245 }
246 
247                                                                                                     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值