嵌入式学习-数据结构

Seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__

#define MAX 100
typedef int datatype;

typedef struct
{
datatype data[MAX];
int top;
}Seqstack;

//创建
Seqstack *create();               
//判空
int empty(Seqstack *S);
//判满
int full(Seqstack *S);
//入栈、进栈、压榨
int push(Seqstack *S, datatype e);
//出栈、弹栈
int pop(Seqstack *S);
//遍历栈
void show(Seqstack *S);

Looplink.h

#ifndef __LOOPLINK__                               
#define __LOOPLINK__                               
#include"Seqstack.h"                               
typedef int datatype;                              
typedef struct Node                                
{                                                  
    union                                          
    {                                              
        datatype data;//数据域                     
        int len;                                   
    };                                             
    struct Node *next;//指针域                     
}Looplink;                                         
//创建                                             
Looplink *list_create();                           
//判空                                             
int list_empty(Looplink *L);                       
                                                   
//申请节点                                         
Looplink *node_buy(datatype e); 
                   
//尾插                                             
int list_insert_tail(Looplink *L, datatype e);     
             
//尾删                                             
int list_delete_tail(Looplink *L);                 
//删除头结点                                       
Looplink *kill_head(Looplink *L);                  
                                                   
//删头后节点的遍历                                                                              
void list_show2(Looplink *L);    
                  
//插入n个数据并删除头结点                          
Looplink *data_len(Looplink *L,int len);           
                                                                                                     
//按位置查找节点                                   
Looplink *list_search_pos(Looplink *L, int pos);   
                                                   
                                                   
//输出约瑟夫单向链表                               
int joseph(Looplink *L,int n, int m, Seqstack *J); 
//进制转换                                         
int transform(int n , int m, Seqstack *H);         
                                                   
                                                   
#endif                                             

Seqstack.c

#include<stdio.h>                                      
#include<stdlib.h>                                     
#include"Seqstack.h"                                   
//创建                                                 
Seqstack *create()                                     
{                                                      
    Seqstack *S=(Seqstack *)malloc(sizeof(Seqstack));  
    if(S==NULL){                                       
        printf("创建失败\n");return NULL;}             
    S->top=-1;//将栈顶置1                              
    printf("创建成功\n");                              
    return S;                                          
}                                                      
                                                       
//判空                                                 
int empty(Seqstack *S)                                 
{                                                      
    return S->top==-1?1:0;                             
}                                                      
                                                       
//判满                                                 
int full(Seqstack *S)                                  
{                                                      
    return S->top==MAX-1?1:0;                          
}                                                      
                                                       
//入栈、进栈、压榨                                     
int push(Seqstack *S, datatype e)                      
{                                                      
    if(NULL==S||full(S))                               
    {                                                  
        printf("入栈失败\n");                          
    }                                                  
    //入栈操作                                         
    S->top++;                                          
    S->data[S->top]=e;                                 
    printf("入栈成功\n");                              
    return 0;                                          
}                                                      
                                                       
//出栈、弹栈                                           
int pop(Seqstack *S)                                   
{                                                      
    if(NULL==S||empty(S))                              
    {                                                  
        printf("出栈失败\n");                          
    }                                                  
    printf("%d出栈成功\n",S->data[S->top]);            
    S->top--;                                          
    return 0;                                          
}                                                      
//遍历栈                                               
void show(Seqstack *S)                                 
{                                                      
    if(NULL==S||empty(S))                              
    {                                                  
        printf("遍历失败\n");return;                   
    }                                                  
    printf("从栈顶到栈底元素依次为:");                
    int i=S->top;                                      
    while(i!=-1)                                       
    {                                                  
        printf("%d\t",S->data[i]);                     
        i--;                                           
    }                                                  
    printf("\n");                                      
    printf("从栈底到栈顶元素依次为:");                
    i=S->top;                                          
    while(i!=-1)                                       
    {                                                  
        printf("%d\t",S->data[S->top-i]);              
        i--;                                           
    }                                                  
    printf("\n");return;                               
}                                                      

Looplink.c

#include<stdio.h>                                       
#include<stdlib.h>                                      
#include"Looplink.h"                                    
#include"Seqstack.h"                                    
//创建                                                  
Looplink *list_create()                                 
{                                                       
    Looplink *L = (Looplink *)malloc(sizeof(Looplink)); 
    if(L==NULL)                                         
    {                                                   
    printf("创建失败\n");                               
    return NULL;                                        
    }                                                   
    //初始化                                            
    L->len=0;                                           
    L->next=L;                                          
    printf("创建成功\n");                               
    return L;                                           
}                                                       
//判空                                                  
int list_empty(Looplink *L)                             
{                                                       
    return L->next==L?1:0;//1表示空,0表示非空          
}                                                       
//申请带数据的节点                                      
Looplink *node_buy(datatype e)                          
{                                                       
    Looplink *L =(Looplink *)malloc(sizeof(Looplink));  
    if(L==NULL)                                         
    {                                                   
        printf("创建失败\n");                           
        return NULL;}                                   
    L->data=e;                                          
    L->next=NULL;                                       
                                                        
    return L;                                           
}                                                       
                                                        
                                                        
//尾插(相当于在节点头部插入)                            
int list_insert_tail(Looplink *L,datatype e)            
{                                                       
    if(NULL==L)                                         
    {printf("链表不存在\n");return -1;}                 
    Looplink *p=node_buy(e);                            
    Looplink *q=L;                                      
    if(list_empty(L))                                   
    {                                                   
        L->next=p;                                      
        p->next=L;                                      
    }                                                   
    else                                                
    {                                                   
        while(q->next!=L)                               
        {                                               
            q=q->next;                                  
        }                                               
                                                        
        //插入逻辑                                      
        p->next=L;                                      
        q->next=p;                                      
    }                                                   
    //表的变化                                          
    L->len++;                                           
    printf("插入成功\n");                               
}                                                       

//插入n个数据并删除头结点(尾插)                                 
Looplink *data_len(Looplink *L,int len)                          
{                                                                
    for(int i=1;i<len+1;i++)                                     
    {                                                            
        list_insert_tail(L,i);                                   
    }                                                            
    Looplink *S=kill_head(L);                                    
                                                                 
    printf("数据创建完成,循环链表中有%d个数据\n", len);           
    return S;                                                    
}                                                                
//按位置查找节点(pos为数据的位置pos>0)                           
Looplink *list_search_pos(Looplink *L, int pos)                  
{                                                                
    if(L==NULL||pos<1)                                           
    {printf("链表不存在\n");return NULL;}                        
    Looplink *q=L;                                               
    for(int i=1;i<pos;i++)                                       
    {                                                            
        q=q->next;                                               
    }                                                            
    return q;                                                    
}                                                                                                                                                                                                                                                             
//输出约瑟夫栈                                                   
int joseph(Looplink *L,int n, int m, Seqstack *J)                
{                                                                
    if(L==NULL||J==NULL)                                         
    {printf("输入错误\n");return -1;}                            
    Looplink *k=L;                                               
    Looplink *p=NULL;                                            
    Looplink *q=NULL;                                            
    printf("%d\n",n);                                            
    for(int i=n;i>0;i--)                                         
    {                                                            
        p=list_search_pos(k,m);                                  
        printf("%d\n",p->data);                                  
        q=list_search_pos(p,i);                                  
        q->next=p->next;                                         
        J->top++;                                                
        J->data[J->top]=p->data;                                 
        k=p->next;//指向下一个节点作为首节点                     
        free(p);//释放第m个空间                                  
    }                                                            
    return 0;                                                    
}                                                                
                                                
//十进制转换//                                                   
int transform(int n , int m, Seqstack *H)                        
{                                                                
    if(n<0||m>10&&m<0||H==NULL)                                  
    {printf("输入错误\n");return -1;}                            
    int tem=n;int res=0;int i=1;                                 
    do                                                           
    {                                                            
        if(full(H)){printf("位数超过%d,栈溢出\n",MAX);return -1;}
        res=tem%m;                                               
        push(H,res);                                             
        tem=tem/m;                                               
        printf("%d\t",tem);                                      
    }while(tem!=0);                                              
    printf("转换成功\n");                                        
    return 0;                                                    
}                                                                

main.c

#include<stdio.h>                                       
#include<stdlib.h>                                      
#include"Looplink.h"                                    
#include"Seqstack.h"                                    
                                                        
int main(int argc, const char *argv[])                  
{                                                       
                                                        
                                                        
    Looplink *L=list_create();                          
    if(L==NULL){printf("创建循环链表失败\n");return -1;}
    Seqstack *J=create();                               
    if(J==NULL){printf("创建栈失败\n");return -1;}      
    int n=8;int m=3;                                    
    Looplink *S=data_len(L,n);//创建约瑟夫数据环        
    //测试查找数据函数正确性                            
    Looplink *TTT=list_search_pos(S,n);                 
    printf("%d\n",TTT->data);                           
    list_show2(S);                                      
    //约瑟夫拆环求解                                    
    joseph(S,n,m,J);                                    
    show(J);                                            
//------进制转换---------                               
                                                        
    Seqstack *H=create();                               
    if(H==NULL){printf("创建栈失败\n");return -1;}      
    int nn=15;//需要转换的数                            
    int mm=2;//转换进制--小于10;                       
    //进制转换                                          
    transform(nn,mm,H);                                 
    show(H);                                            
    return 0;                                           
}                                                       

result

约瑟夫参数:n=8;m=3;
进制转化:15转为2进制;
在这里插入图片描述
约瑟夫参数:n=10;m=6;
进制转化:23转为8进制;
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值