嵌入式学习-数据结构

数据结构day2-链表

Linklist.h

#ifndef __LINKLIST__           
#define __LINKLIST__           
typedef char datatype;//定义数据类型                                
typedef struct Node //定义链表数据类型           
{                             
    union                      
    {                          
    datatype data;//数据域     
    int len;                   
    };                         
    struct Node *next;//指针域                            
}Linklist;                                                                               
//创建                         
Linklist *list_create();       
//判空                         
int list_empty(Linklist *L);   
//遍历                      
void listshow(Linklist *L); 
//按位置查找节点指针
Linklist *find_node(Linklist *L,int pos);
//尾删1                         
int list_delete_tail(Linklist *L);
//尾删2
int list_delete_tail2(Linklist *L);                            
//按位置修改                                                        
int list_update_pos(Linklist *L, int pos,datatype e);                                                                                 
//按值修改                                                          
int list_update_value(Linklist *L, datatype old_e, datatype new_e);                                                                   
//链表反转函数                                                      
void list_reverse(Linklist *L);                                     

Linklist.c

#include<stdio.h>    
#include"Linklist.h" 
#include<stdlib.h>   
//尾删                                         
int list_delete_tail(Linklist *L)              
{                                              
    //判断                                     
    if(NULL==L||list_empty(L))                 
    {printf("链表为空,删除失败\n");return -1;}
    // 找到倒数第二个节点                      
    Linklist *p=L;                             
    while(p->next->next!=NULL)                 
    {p=p->next;}                               
    //标记要删除的节点                         
    Linklist *q=p->next;                       
    //置空                                     
    p->next=NULL;                              
    //释放最后节点的空间                       
    free(q);                                   
    q=NULL;                                    
    L->len--;                                  
    printf("尾删成功\n");                      
    return 0;                                  
}                                              
//尾删2                                        
int list_delete_tail2(Linklist *L)             
{                                              
    //判断                                     
    if(NULL==L||list_empty(L))                 
    {printf("链表为空,删除失败\n");return -1;}                                       
    // 找到倒数第二个节点                      
    Linklist *p=find_node(L,L->len-1);         
    //标记要删除的节点                         
    Linklist *q=p->next;                       
    //置空                                     
    p->next=NULL;                              
    //释放最后节点的空间                       
    free(q);                                   
    q=NULL;                                    
    L->len--;                                  
    printf("尾删成功\n");                      
    return 0;                                  
}     
  //按位置修改链表                                   
int list_update_pos(Linklist *L,int pos,datatype e)
{                                                  
    if(L==NULL||list_empty(L)||pos<1||pos>L->len)  
    {printf("链表为空,修改失败\n");}              
    Linklist *p=find_node(L,pos);                  
    p->data=e;                                     
    printf("位置%d修改成功\n",pos);                                                             
}         
                                         
 //按值修改链表                                                                                                                    
int list_update_value(Linklist *L, datatype old_e, datatype new_e)
{                                                                 
    if(L==NULL||list_empty(L))                                    
    {printf("链表为空,修改失败\n");}                             
    Linklist *p=L;int flag=1;                                     
    for(int i=1;i<L->len+1;i++)                                   
    {                                                             
        p=p->next;                                                
        if(p->data==old_e)                                        
        {p->data=new_e;flag=1;}                                   
    }                                                             
    if(flag==1)                                                   
    {                                                             
        printf("修改成功\n");                                     
    }                                                             
    else                                                          
    {                                                             
        printf("无重复值\n");                                     
    }                                                             
}                                                                 
//链表反置函数                                  
void list_reverse(Linklist *L)                  
{                                               
    if(NULL==L||list_empty(L))                  
    {printf("链表为空,无法排序\n");return -1;} 
    if(L->len==1)                               
    {                                           
        printf("无需排序\n",return 0;);         
    }                                           
                                                
    Linklist *p=NULL;                           
    Linklist *q=NULL;                           
    Linklist *n=NULL;                           
    for(int i=2;i<L->len+1;i++)                 
    {                                           
        p=find_node(L,i-1);                     
        q=L->next;                              
        L->next=p->next;                        
        if(i<L->len)                            
        {n=p->next->next;}                      
        else                                    
        {n=NULL;}                               
        p->next->next=q;                        
        p->next=n;                              
    }                                           
    printf("排序成功\n");                       
    return 0;                                   
}  
//反置函数第二种方法           
void list_reverse2(Linklist *L)
{                              
    Linklist *s=L->next;       
    Linklist *p=s->next;       
    L->next=NULL;              
    while(s!=NULL)             
    {                          
        p=s;                   
        s=s->next;             
                               
        p->next=L->next;       
        L->next=p;             
    }                          
return;                        
}                              
//创建链表表头(火车头)                                                                                                                         
Linklist *list_create()                              
{                                                    
    Linklist *L=(Linklist*)malloc(sizeof(Linklist)); 
    if(NULL==L)                                      
    {                                                
        printf("创建失败\n");                        
        return NULL;                                 
    }                                                
    //初始化                                         
    L->len=0;                                        
    L->next=NULL;                                    
    printf("创建成功\n");                            
    return L;                                        
}                                                    
                                                     
//判空                                               
int list_empty(Linklist *L)                          
{                                                    
    return NULL==L->next?1:0;                        
}                                                    
   //遍历函数:显示链表结果                         
void listshow(Linklist *L)      
{                               
    if(NULL==L || list_empty(L))
    {                           
        printf("链表为空\n");   
        return;                 
    }                           
    //遍历逻辑                  
    printf("链表结果为;\n");    
    Linklist *q =L->next;       
    while(q!=NULL)              
    {                           
        printf("%c\t",q->data); 
        q=q->next;              
    }                           
    printf("\n");               
    return;                     
}                               
   //按位置查找返回查找到的节点                
Linklist *find_node(Linklist *L,int pos)    
{                                           
    if(NULL==L||pos<0||pos>L->len)//判断逻辑
    {printf("查找失败\n");return NULL;}     
    //查找节点                              
    Linklist *q=L;                          
    for(int i=1;i<pos+1;i++)                
    {                                       
        q=q->next;                          
    }                                       
    return q;                               
}                                           
                            

main.c

#include<stdio.h>
#include"Linklist.h"
int main(int argc, const char *argv[])
{
	Linklist *L = list_create();
	if(NULL==L)
	{
	return -1;
	}
	//调用头插函数
	list_insert_head(L,'w');
	list_insert_head(L,'e');
	list_insert_head(L,'l');
	list_insert_head(L,'l');
	list_insert_head(L,'d');
	list_insert_head(L,'o');
	list_insert_head(L,'n');
	list_insert_head(L,'e');
	
	printf("尾删1测试\n");
	list_delete_tail(L);
	listshow(L);
	printf("尾删2测试\n");
	list_delete_tail2(L);
	listshow(L);
	printf("按位置修改测试\n");
	list_update_pos(L,2,'Y');
	listshow(L);
	printf("按值修改测试\n");
	list_update_value(L,'Y','L');
	listshow(L);
	printf("反置测试\n");
	list_reverse(L);
	listshow(L);
}

results

ubuntu@ubuntu:02_day$ gcc *.c
Linklist.c: In function ‘add_test’:
Linklist.c:184:6: warning: comparison of distinct pointer types lacks a cast
if(p==&p->data)
^~
ubuntu@ubuntu:02_day$ ./a.out
创建成功
头插成功
头插成功
头插成功
头插成功
头插成功
头插成功
头插成功
头插成功
尾删1测试
尾删成功
链表结果为;
e n o d l l e
尾删2测试
尾删成功
链表结果为;
e n o d l l
按位置修改测试
位置2修改成功
链表结果为;
e Y o d l l
按值修改测试
修改成功
链表结果为;
e L o d l l
反置测试
排序成功
链表结果为;
l l d o L e

运行结果输出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值