【数据结构】链表

本文详细介绍了如何在C语言中使用链表结构,包括头插法、尾插法、按位置插入和删除数据,以及链表的遍历和长度维护。
摘要由CSDN通过智能技术生成

链表的头尾操作及按位置操作

一、main函数

 #include <stdio.h>
 #include <stdlib.h>
 #include "./3.linklist.h"
 int main(int argc, const char *argv[])
 {
 
     linkList* head = create_linkList();
 
     //头插法插入数据 
     insertHead_linklist(head,10);
     insertHead_linklist(head,20);
     insertHead_linklist(head,30);
     insertHead_linklist(head,40);
     insertHead_linklist(head,50);
 
     show_linklist(head);   // 遍历链表 
 
     //尾插法插入数据 
     insertEnd_linklinst(head,99);
     insertEnd_linklinst(head,88);
     insertEnd_linklinst(head,77);
     insertEnd_linklinst(head,66);                                           
 
     show_linklist(head);
 
     delHead_linklist(head);     //头删法删除数据
     show_linklist(head);
 
     delEnd_linklist(head);      //尾删法删除数据
     show_linklist(head);
 
 
     insertByindex_linklist(head,2,10086); //按位置插入数据
     show_linklist(head);
 
     delByindex_linklist(head,6);        //按位置删除数据
     show_linklist(head);
 
     selectByindex_linklist(head,5);     //按位置查找数据
 
     freelink(head);                 //释放链表
     return 0;
 }
                                                                             

二、功能函数

#include <stdio.h>                                                                                                     
#include <stdlib.h>                                                                                                    
#include "./3.linklist.h"                                                                                              
                                                                                                                       
//创建链表                                                                                                             
linkList*create_linkList(void)                                                                                         
{                                                                                                                      
    linkList* head = (linkList*)malloc(sizeof(linkList));                                                              
    if(NULL == head)                                                                                                   
    {                                                                                                                  
        printf("头结点申请失败,创建单链表失败\n");                                                                    
        return NULL ;                                                                                                  
    }                                                                                                                  
    head->text.len =0;                                                                                                 
    head->next = NULL ;                                                                                                
                                                                                                                       
    return head;                                                                                                       
}                                                                                                                      
                                                                                                                       
//释放链表                                                                                                             
void freelink(linkList*temp)                                                                                           
{                                                                                                                      
    free(temp);                                                                                                        
    return;                                                                                                            
}                                                                                                                      
                                                                                                                       
void insertHead_linklist(linkList*head,dataType num)     //头插法插入数据                                              
{                                                                                                                      
    linkList*temp = (linkList*)malloc(sizeof(linkList));                                                               
    if(NULL == temp)                                                                                                   
    {                                                                                                                  
        printf("结点申请失败,头插失败\n");                                                                            
        return ;                                                                                                       
    }                                                                                                                  
    temp->text.data= num;                                                                                              
    temp->next = NULL ;                                                                                                
                                                                                                                       
    temp->next=head->next;                                                                                             
    head->next=temp;                                                                                                   
                                                                                                                       
    head->text.len++;       //更新链表长度                                                                             
    return ;                                                                                                           
}                                                                                                                      
                                                                                                                       
void show_linklist(linkList*head)      //遍历链表                                                                      
{                                                                                                                      
    linkList*p=head;                                                                                                   
    while(p->next != NULL)                                                                                             
    {                                                                                                                  
        p=p->next;                                                                                                     
        printf("%d ",p->text.data);                                                                                    
    }                                                                                                                  
    printf("\n");                                                                                                      
    return ;                                                                                                           
}                                                                                                                      
                                                                                                                       
void insertEnd_linklinst(linkList*head,dataType num)  //尾插法插入数据                                                 
{                                                                                                                      
    linkList* p =head;                                                                                                 
    while(p->next != NULL )                                                                                            
    {                                                                                                                  
        p=p->next;                                                                                                     
    }                                                                                                                  
    linkList*temp = (linkList*)malloc(sizeof(linkList));                                                               
    if( NULL == temp)                                                                                                  
    {                                                                                                                  
        printf("结点申请失败,尾插失败\n");                                                                             
        return ;                                                                                                       
    }                                                                                                                  
    temp->text.data = num;                                                                                             
    temp->next = NULL ;                                                                                                
                                                                                                                       
    p->next=temp;                                                                                                      
                                                                                                                       
    head->text.len++;                                                                                                  
                                                                                                                       
    return ;                                                                                                           
}                                                                                                                      
                                                                                                                       
int isEmpty_linklist(linkList*head)                                                                                    
{                                                                                                                      
    return head->next == NULL?1:0;                                                                                     
}                                                                                                                      
//头删法删除数据                                                                                                       
void delHead_linklist(linkList*head)                                                                                   
{                                                                                                                      
    if(isEmpty_linklist(head))                                                                                         
    {                                                                                                                  
        printf("链表为空,头删失败\n");                                                                                
        return ;                                                                                                       
    }                                                                                                                  
    linkList*temp=head->next;                                       
    head->next=head->next->next ;                                   
    head->text.len--;                                               
    freelink(temp);                                                 
    return ;                                                        
                                                                    
}                                                                   
                                                                    
//尾删法删除数据                                                    
void delEnd_linklist(linkList*head)                                 
{                                                                   
    if(isEmpty_linklist(head))                                      
    {                                                               
        printf("链表为空,尾删失败\n");                             
        return ;                                                    
    }                                                               
    linkList*p=head;                                                
    while(NULL != p->next->next)                                    
    {                                                               
        p=p->next;                                                  
    }                                                               
    linkList*temp=p->next;                                          
    p->next=NULL;                                                   
    head->text.len--;                                               
    freelink(temp);                                                 
                                                                    
    return ;                                                        
}                                                                   
                                                                    
//按位置插入数据                                                    
void insertByindex_linklist(linkList*head,int index,dataType num)   
{                                                                   
    if(index<1 || index>head->text.len+1)                           
    {                                                               
        printf("位置非法,插入失败\n");                             
        return ;                                                    
    }                                                               
   int i=1;                                                        
   linkList*p=head;                                                
   for(i;i<index;i++)                                              
   {                                                               
       p=p->next;                                                  
   }                                                               
   linkList*temp = (linkList*)malloc(sizeof(linkList));            
   if(NULL == temp)                                                
   {                                                               
       printf("结点申请失败,插入失败\n");                          
       return ;                                                    
   }                                                               
   temp->text.data=num;                                            
   temp->next=p->next;                                             
   p->next = temp;                                                 
                                                                   
   head->text.len++;                                               
   return ;                                                        
                                                                   
                                                                   
                                                                   
/按位置删除数据                                                    
oid delByindex_linklist(linkList*head,int index)                   
                                                                   
   if(index<1 || index>head->text.len+1)                           
   {                                                               
       printf("位置非法,删除失败\n");                             
       return ;                                                    
   }                                                               
   if(isEmpty_linklist(head))                                      
   {                                                               
       printf("链表为空,无法进行删除\n");                         
       return ;                                                    
   }                                                               
   int i=1;                                                        
   linkList*p=head;                                                
   for(i;i<index;i++)                                              
   {                                                               
       p=p->next;                                                  
   }                                                               
   linkList*temp=p->next;                                          
   p->next=p->next->next;                                          
   freelink(temp);                                                 
   head->text.len--;                                               
   return;                                                         
}                                                           
                                                            
//按位置查找数据                                            
void selectByindex_linklist(linkList*head,int index)        
{                                                           
    if(index>head->text.len)                                
    {                                                       
        printf("位置非法,无法查询\n");                     
        return ;                                            
    }                                                       
    int i=1;                                                
    linkList*p=head;                                        
    for(i;i<=index;i++)                                     
    {                                                       
        p=p->next;                                          
    }                                                       
    printf("%d\n",p->text.data);                            
    return ;                                                
}                                                           
                                                            
//直接插入排序                                              
void insertSort_linklist(linkList*head,dataType num)        
{                                                           
                                                            
    linkList*temp = (linkList*)malloc(sizeof(linkList));    
    if( NULL == temp)                                       
    {                                                       
        printf("结点申请失败,插入失败\n");                  
        return ;                                            
    }                                                       
    temp->text.data = num;                                  
    temp->next=NULL;                                        
                                                            
    linkList* p= head;                                      
    while(p->next != NULL)                                  
    {                                                       
        if(temp->text.data <= p->text.data)                 
        {                                                   
            break;                                          
        }                                                   
        else                                                
        {                                                   
            p=p->next;                     
        }                                  
    }                                      
    temp->next=p->next;                    
    p->next=temp->next;                    
                                           
    head->text.len++;                      
    return;                                
}                                          
                                           
                                           

三、头文件

#ifndef __LINKLIST_H__                 
#define __LINKLIST_H__                 

typedef int dataType;

union msg{
    dataType data;
    int len;
};

typedef struct node{
    union msg text;
    struct node* next;
}linkList;

linkList*create_linkList(void);
void freelink(linkList*head);
void insertHead_linklist(linkList*head,dataType num);
void insertEnd_linklinst(linkList*head,dataType num);
void show_linklist(linkList*head);
void delHead_linklist(linkList*head);
void delEnd_linklist(linkList*head);
void insertByindex_linklist(linkList*head,int index,dataType num);
void delByindex_linklist(linkList*head,int index);
void selectByindex_linklist(linkList*head,int index);                            
void insertSort_linklist(linkList*head,dataType num);
#endif
                                                                                 

四、makefile文件

-include ./Makefile.cfg

$(Target):$(Obj)
    @$(CC) $^ -o $@

%.o:%.c
    @$(CC) $^ $(CAN) $@

clean:
    @rm $(Obj) $(Target)                

五、Makefile.cfg文件

Obj:= 1.main.o 2.linklist.o                            
Target:=a.out

CC:=gcc
CAN:=-c -o

六、运行结果

  • 28
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值