2024/6/5 双向链表 顺序栈 顺序队列 链式队列

双向链表:

#include <stdio.h>                                          
#include "./3_list.h"                                       
                                                            
int main(int argc, const char *argv[])                      
{                                                           
    Dublinklist* head = create_doublelinklist();            
    insertByRear_doublelinklist(head, 14);                  
    insertByRear_doublelinklist(head, 23);                  
    insertByRear_doublelinklist(head, 567);                 
    show_doublelinklist(head);                              
                                                            
    insertByPos_doublelinklist(head, 123, 4);               
    show_doublelinklist(head);                              
    insertByPos_doublelinklist(head, 124, 3);               
    show_doublelinklist(head);                              
    insertByPos_doublelinklist(head, 564, 1);               
    show_doublelinklist(head);                              
                                                            
    printf("%d\n", deleteByPos_doublelinklist(head, 5));    
    show_doublelinklist(head);                              
    printf("%d\n", deleteByPos_doublelinklist(head, 4));    
    show_doublelinklist(head);                              
    printf("%d\n", deleteByPos_doublelinklist(head, 1));    
    show_doublelinklist(head);                              
                                                            
    return 0;                                               
}                                                           
                                                            
                                                            
                                                            
                                                            
#include<stdio.h>                                                                                                  
#include<stdlib.h>                                                                                                 
#include"./3_list.h"                                                                                               
                                                                                                                   
Dublinklist* create_doublelinklist()                                                                               
{                                                                                                                  
    Dublinklist* head = (Dublinklist*)malloc(sizeof(Dublinklist));                                                 
    if(NULL == head)                                                                                               
    {                                                                                                              
        printf("双向链表创建失败\n");                                                                              
        return NULL;                                                                                               
    }                                                                                                              
                                                                                                                   
    head->msg.len = 0;                                                                                             
    head->next = NULL;                                                                                             
    head->prev = NULL;                                                                                             
                                                                                                                   
    return head;                                                                                                   
                                                                                                                   
}                                                                                                                  
                                                                                                                   
void insertByFront_doublelinklist(Dublinklist* head,datatype num)                                                  
{                                                                                                                  
    Dublinklist* temp = (Dublinklist*)malloc(sizeof(Dublinklist));                                                 
    if(NULL == temp)                                                                                               
    {                                                                                                              
        printf("结点创建失败\n");                                                                                  
        return;                                                                                                    
    }                                                                                                              
                                                                                                                   
    temp->msg.data = num;                                                                                          
    temp->next = NULL;                                                                                             
    temp->prev = NULL;                                                                                             
                                                                                                                   
    temp->next = head->next;                                                                                       
    head->next = temp;                                                                                             
    if(head->next->next ==NULL)                                                                                    
    {                                                                                                              
        temp->prev = head;                                                                                         
                                                                                                                   
    }                                                                                                              
    else                                                                                                           
    {                                                                                                              
        temp->prev = temp->next->prev;                                                                             
        temp->next->prev = temp;                                                                                   
    }                                                                                                              
                                                                                                                   
    head->msg.len++;                                                                                               
}                                                                                                                  
                                                                                                                   
void insertByRear_doublelinklist(Dublinklist* head,datatype num)                                                   
{                                                                                                                  
    Dublinklist* temp = (Dublinklist*)malloc(sizeof(Dublinklist));                                                 
    if(NULL == temp)                                                                                               
    {                                                                                                              
        printf("结点创建失败\n");                                                                                  
        return;                                                                                                    
    }                                                                                                              
                                                                                                                   
    temp->msg.data = num;                                                                                          
    temp->next = NULL;                                                                                             
    temp->prev = NULL;                                                                                             
                                                                                                                   
    Dublinklist* p = head;                                                                                         
    while(p->next !=NULL)                                                                                          
    {                                                                                                              
        p =p->next;                                                                                                
    }                                                                                                              
    temp->next = p->next;                                                                                          
    p->next = temp;                                                                                                
    temp->prev = p;                                                                                                
    head->msg.len++;                                                                                               
}                                                                                                                  
                                                                                                                   
void insertByPos_doublelinklist(Dublinklist* head,datatype num,int pos)                                            
{                                                                                                                  
                                                                                                                   
    if(pos<=0 || pos>head->msg.len+1)                                                                              
    {                                                                                                              
        printf("插入位置不合法\n");                                                                                
        return;                                                                                                    
    }                                                                                                              
    Dublinklist* p =head;                                                                                          
    for(int i=0;i<pos-1;i++)                                                                                       
    {                                                                                                              
        p=p->next;                                                                                                 
        if(NULL == p)                                                                                              
        {                                                                                                          
            printf("插入位置非法\n");                                                                              
            return;                                                                                                
        }                                                                                                          
    }                                                                                                              
                                                                                                                   
    Dublinklist* temp = (Dublinklist*)malloc(sizeof(Dublinklist));                                                 
    if(NULL == temp)                                                                                               
    {                                                                                                              
        printf("结点创建失败\n");                                                                                  
        return;                                                                                                    
    }                                                                                                              
                                                                                                                   
    temp->msg.data = num;                                                                                          
    temp->next = NULL;                                                                                             
    temp->prev = NULL;                                                                                             
                                                                                                                   
    temp->next = p->next;                                                                                          
    p->next = temp;                                                                                                
    temp->prev =p;                                                                                                 
    if(temp->next != NULL)                                                                                         
    {                                                                                                              
        temp->next->prev = temp;                                                                                   
    }                                                                                                              
    head->msg.len++;                                                                                               
    return;                                                                                                        
}                                                                                                                  
                                                                                                                   
datatype deleteByFront_doublelinklist(Dublinklist* head)                                                           
{                                                                                                                  
    if(NULL == head || NULL == head->next)                                                                         
    {                                                                                                              
        printf("双向链表为空\n");                                                                                  
        return (datatype)-1;                                                                                       
                                                                                                                   
    }                                                                                                              
    Dublinklist* temp = head->next;                                                                                
                                                                                                                   
    head->next =temp->next;                                                                                        
    temp->prev = head;                                                                                             
    if(temp->next != NULL)                                                                                         
    {                                                                                                              
        temp->next->prev = temp;                                                                                   
    }                                                                                                              
    datatype num = temp->msg.data;                                                                                 
    free(temp);                                                                                                    
    head->msg.len--;                                                                                               
    return num;                                                                                                    
                                                                                                                   
}                                                                                                                  
                                                                                                                   
datatype deleteByRear_doublelinklist(Dublinklist* head)                                                            
{                                                                                                                  
    if(NULL == head || NULL == head->next)                                                                         
    {                                                                                                              
        printf("双向链表为空\n");                                                                                  
        return (datatype)-1;                                                                                       
                                                                                                                   
    }                                                                                                              
    Dublinklist* temp = head->next;                                                                                
                                                                                                                   
    while(temp->next !=NULL)                                                                                       
    {                                                                                                              
        temp = temp->next;                                                                                         
                                                                                                                   
    }                                                                                                              
    temp->prev->next = temp->next;                                                                                 
    datatype num = temp->msg.data;                                                                                 
    free(temp);                                                                                                    
    head->msg.len--;                                                                                               
    return num;                                                                                                    
}                                                                                                                  
                                                                                                                   
datatype deleteByPos_doublelinklist(Dublinklist* head,int pos)                                                     
{                                                                                                                  
    if(NULL == head || NULL == head->next)                                                                         
    {                                                                                                              
        printf("双向链表为空\n");                                                                                  
        return (datatype)-1;                                                                                       
                                                                                                                   
    }                                                                                                              
    if(pos<=0 || pos>head->msg.len+1)                                                                              
    {                                                                                                              
        printf("插入位置不合法\n");                                                                                
        return (datatype)-1;                                                                                       
    }                                                                                                              
    Dublinklist* p =head;                                                                                          
    for(int i=0;i<pos;i++)                                                                                         
    {                                                                                                              
        p=p->next;                                                                                                 
        if(NULL == p)                                                                                              
        {                                                                                                          
            printf("插入位置非法\n");                                                                              
            return (datatype)-1;                                                                                   
        }                                                                                                          
    }                                                                                                              
    p->prev->next = p->next;                                                                                       
    if(p->next !=NULL)                                                                                             
    {                                                                                                              
        p->next->prev = p->prev;                                                                                   
    }                                                                                                              
    datatype num = p->msg.data;                                                                                    
    free(p);                                                                                                       
    head->msg.len--;                                                                                               
    return num;                                                                                                    
}                                                                                                                  
                                                                                                                   
void show_doublelinklist(Dublinklist* head)                                                                        
{                                                                                                                  
    Dublinklist* p = head;                                                                                         
    while(p->next != NULL)                                                                                         
    {                                                                                                              
        p = p->next;                                                                                               
        printf("%d ",p->msg.data);                                                                                 
    }                                                                                                              
    putchar(10);                                                                                                   
    return;                                                                                                        
}                                                                                                                  
                                                                                                                   
                                                                                                                   
                                                                                                                   
                                                                                                                   
                                                                                                                   
                                                                                                                   
                                                                                                                   
#ifndef __DOUBLE_LINKLIST_H__                                                          
#define __DOUBLE_LINKLIST_H__                                                          
                                                                                       
typedef int datatype;                                                                  
typedef struct dublnklst                                                               
{                                                                                      
    union                                                                              
    {                                                                                  
        int len;                                                                       
        datatype data;                                                                 
    }msg;                                                                              
    struct dublnklst* next;                                                            
    struct dublnklst* prev;                                                            
}Dublinklist;                                                                          
Dublinklist* create_doublelinklist();                                                  
void insertByFront_doublelinklist(Dublinklist* head, datatype num);                    
void insertByRear_doublelinklist(Dublinklist* head, datatype num);                     
void show_doublelinklist(Dublinklist* head);                                           
datatype deleteByFront_doublelinklist(Dublinklist* head);                              
datatype deleteByRear_doublelinklist(Dublinklist* head);                               
void insertByPos_doublelinklist(Dublinklist* head, datatype num, int pos);             
datatype deleteByPos_doublelinklist(Dublinklist* head, int pos);                       
                                                                                       
#endif                                                                                 
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       
                                                                                       

 

 顺序栈:

#include <stdio.h>                       
#include "./3_stack.h"                   
                                         
int main()                               
{                                        
    stack* st = create_stack();          
                                         
    insert_stack(st,3);                  
    insert_stack(st,7);                  
                                         
    show_stack(st);                      
                                         
    datatype x = delete_stack(st);       
    printf("%d\n",x);                    
    show_stack(st);                      
                                         
                                         
    free_stack(&st);                     
    return 0;                            
}                                        
                                         
                                         
                                         
                                         
                                         
                                         
                                         
#include <stdio.h>                                            
#include <stdlib.h>                                           
#include "./3_stack.h"                                        
                                                              
                                                              
                                                              
stack* create_stack(void)                                     
{                                                             
                                                              
    stack* st = (stack*)malloc(sizeof(stack));                
    if(NULL == st)                                            
    {                                                         
        printf("顺序栈创建失败\n");                           
        return NULL;                                          
    }                                                         
    st->pos=0;                                                
    return st;                                                
}                                                             
                                                              
                                                              
int insert_stack(stack* st,datatype num)                      
{                                                             
    if(st->pos >= N)                                          
    {                                                         
        printf("顺序栈已满\n");                               
        return -1;                                            
    }                                                         
                                                              
    st->data[st->pos] = num;                                  
    st->pos++;                                                
                                                              
    return 0;                                                 
}                                                             
                                                              
                                                              
datatype delete_stack(stack* st)                              
{                                                             
    if(0 == st->pos)                                          
    {                                                         
        printf("顺序栈为空\n");                               
        return (datatype)-1;                                  
    }                                                         
    st->pos--;                                                
    datatype num = st->data[st->pos];                         
    return num;                                               
}                                                             
                                                              
void show_stack(stack* st)                                    
{                                                             
    for(int i=0;i<st->pos;i++)                                
    {                                                         
        printf("%d ",st->data[i]);                            
                                                              
    }                                                         
    putchar(10);                                              
return;                                                       
}                                                             
                                                              
void free_stack(stack** st)                                   
{                                                             
    free(*st);                                                
    *st = NULL;                                               
    printf("顺序栈已删除\n");                                 
}                                                             
#ifndef __STACK_H__
#define __STACK_H__

#define N 7
typedef int datatype;
typedef struct
{
    datatype data[N];
    int pos;
}stack;


stack* create_stack(void);
int insert_stack(stack* st,datatype num);
datatype delete_stack(stack* st);
void show_stack(stack* st);

void free_stack(stack** st);                  






#endif
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              
                                              

 顺序队列

#include <stdio.h>                    
#include "./3_queue.h"                
                                      
int main()                            
{                                     
    queue* sq = create_queue();       
                                      
    insert_queue(sq,12);              
    insert_queue(sq,313);             
    insert_queue(sq,34);              
    insert_queue(sq,234);             
    insert_queue(sq,68);              
    insert_queue(sq,5);               
    insert_queue(sq,91);              
    insert_queue(sq,4);               
    insert_queue(sq,7);               
    show_queue(sq);                   
                                      
    datatype x = delete_queue(sq);    
    printf("%d\n",x);                 
    datatype x1 = delete_queue(sq);   
    printf("%d\n",x1);                
    datatype x2 = delete_queue(sq);   
    printf("%d\n",x2);                
    datatype x3 = delete_queue(sq);   
    printf("%d\n",x3);                
    show_queue(sq);                   
                                      
    printf("%d\n",count_num(sq));     
                                      
    free_queue(&sq);                  
    return 0;                         
}                                     
                                      
#include <stdio.h>                                      
#include <stdlib.h>                                     
#include "./3_queue.h"                                  
                                                        
                                                        
                                                        
queue* create_queue(void)                               
{                                                       
                                                        
    queue* sq = (queue*)malloc(sizeof(queue));          
    if(NULL == sq)                                      
    {                                                   
        printf("顺序队列创建失败\n");                   
        return NULL;                                    
    }                                                   
    sq->front,sq->rear = 0;                             
    return sq;                                          
}                                                       
                                                        
                                                        
int insert_queue(queue* sq,datatype num)                
{                                                       
    if((sq->rear+1)%N ==sq->front)                      
    {                                                   
        printf("顺序队列已满\n");                       
        return -1;                                      
    }                                                   
                                                        
    sq->data[sq->rear] = num;                           
    sq->rear = (sq->rear+1)%N;                          
                                                        
    return 0;                                           
}                                                       
                                                        
                                                        
datatype delete_queue(queue* sq)                        
{                                                       
    if(sq->rear == sq->front)                           
    {                                                   
        printf("顺序队列为空\n");                       
        return (datatype)-1;                            
    }                                                   
                                                        
    datatype num = sq->data[sq->front];                 
    sq->front = (sq->front+1)%N;                        
    return num;                                         
}                                                       
                                                        
int count_num(queue* sq)                                
{                                                       
    return (sq->rear-sq->front+N)%N;                    
}                                                       
                                                        
void show_queue(queue* sq)                              
{                                                       
    for(int i=sq->front;i !=sq->rear;i++)               
    {                                                   
        printf("%d ",sq->data[i]);                      
                                                        
    }                                                   
    putchar(10);                                        
return;                                                 
}                                                       
                                                        
void free_queue(queue** sq)                             
{                                                       
    free(*sq);                                          
    *sq = NULL;                                         
    printf("顺序队列已删除\n");                         
}                                                       
                                                        
                                                        
                                                        
                                                        
#ifndef __QUEUE_H__
#define __QUEUE_H__

#define N 30
typedef int datatype;
typedef struct
{
    datatype data[N];
    int front;
    int rear;
}queue;


queue* create_queue(void);
int insert_queue(queue* sq,datatype num);
datatype delete_queue(queue* sq);
void show_queue(queue* sq);
void free_queue(queue** sq);
int count_num(queue* sq);

#endif
                                                         
                                                         
                                                         
                                                         
                                                         
                                                         
                                                         
                                                         
                                                         
                                                         
                                                         

 链式队列

#include<stdio.h>                          
#include"./3_linkqueue.h"                  
                                           
int main()                                 
{                                          
                                           
    op* lq = create_linkqueue();           
                                           
    input_linkqueue(lq,1);                 
    input_linkqueue(lq,235);               
    input_linkqueue(lq,78);                
    input_linkqueue(lq,47);                
                                           
    show_linkqueue(lq);                    
                                           
    printf("%d\n",output_linkqueue(lq));   
    printf("%d\n",output_linkqueue(lq));   
    printf("%d\n",output_linkqueue(lq));   
    show_linkqueue(lq);                    
                                           
                                           
                                           
                                           
                                           
                                           
                                           
                                           
    return 0;                              
                                           
}                                          
                                           
                                           
                                           
                                           

 

#include<stdio.h>                                                    
#include<stdlib.h>                                                   
#include"./3_linkqueue.h"                                            
                                                                     
                                                                     
                                                                     
                                                                     
op* create_linkqueue()                                               
{                                                                    
    op* fr = (op*)malloc(sizeof(op));                                
    fr->front = (linkqueue*)malloc(sizeof(linkqueue));               
    if(NULL == fr->front)                                            
    {                                                                
        printf("创建队列失败\n");                                    
        return (op*)-1;                                              
    }                                                                
                                                                     
    fr->front->msg.len = 0;                                          
    fr->front->next = NULL;                                          
                                                                     
    fr->rear = fr->front;                                            
    return fr;                                                       
}                                                                    
                                                                     
void input_linkqueue(op* fr,datatype num)                            
{                                                                    
    linkqueue* temp = (linkqueue*)malloc(sizeof(linkqueue));         
        if(NULL == temp)                                             
        {                                                            
            printf("创建结点失败\n");                                
            return;                                                  
        }                                                            
    temp->msg.data = num;                                            
    temp->next = NULL;                                               
                                                                     
    temp->next = fr->rear->next;                                     
    fr->rear->next = temp;                                           
    fr->rear = fr->rear->next;                                       
                                                                     
    fr->front->msg.len++;                                            
}                                                                    
                                                                     
datatype output_linkqueue(op* fr)                                    
{                                                                    
    if(fr->rear == fr->front)                                        
    {                                                                
        printf("队列为空\n");                                        
        return(datatype)-1;                                          
                                                                     
    }                                                                
    linkqueue* temp = fr->front->next;                               
    fr->front->next = fr->front->next->next;                         
    datatype num = temp->msg.data;                                   
    free(temp);                                                      
    if(fr->front->next == NULL)                                      
    {                                                                
        fr->rear = fr->front;                                        
                                                                     
    }                                                                
    fr->front->msg.len--;                                            
    return num;                                                      
}                                                                    
                                                                     
                                                                     
void show_linkqueue(op* fr)                                          
{                                                                    
    linkqueue* p = fr->front;                                        
    while(p != fr->rear)                                             
    {                                                                
        p = p->next;                                                 
        printf("%d ",p->msg.data);                                   
    }                                                                
    putchar(10);                                                     
    return;                                                          
}                                                                    
                                                                     
                                                                     
                                                                     
                                                                     
                                                                     
#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__

typedef int datatype;
typedef struct lque
{
    union
    {
        int len;
        datatype data;
    }msg;
    struct lque* next;
}linkqueue;

typedef struct
{
    linkqueue* front;
    linkqueue* rear;
}op;


op* create_linkqueue();
void input_linkqueue(op* fr,datatype num);
datatype output_linkqueue(op* fr);
void show_linkqueue(op* fr);                                            

#endif
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        
                                                                        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值