【数据结构】链表

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

一、main函数

cs 复制代码
 #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;
 }
                                                                             

二、功能函数

cs 复制代码
#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;                                
}                                          
                                           
                                           

三、头文件

cs 复制代码
#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文件

bash 复制代码
-include ./Makefile.cfg

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

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

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

五、Makefile.cfg文件

bash 复制代码
Obj:= 1.main.o 2.linklist.o                            
Target:=a.out

CC:=gcc
CAN:=-c -o

六、运行结果

相关推荐
走向自由40 分钟前
Leetcode 最长回文子串
数据结构·算法·leetcode·回文·最长回文
nuo5342021 小时前
The 2024 ICPC Kunming Invitational Contest
c语言·数据结构·c++·算法
特种加菲猫1 小时前
初阶数据结构之队列的实现
开发语言·数据结构·笔记
编程探索者小陈2 小时前
【优先算法】专题——双指针
数据结构·算法·leetcode
Sunyanhui12 小时前
力扣 三数之和-15
数据结构·算法·leetcode
@小博的博客2 小时前
C++初阶学习第十三弹——容器适配器和优先级队列的概念
开发语言·数据结构·c++·学习
Mr__vantasy3 小时前
数据结构(初阶6)---二叉树(遍历——递归的艺术)(详解)
c语言·开发语言·数据结构·算法·leetcode
IT 青年3 小时前
数据结构 (6)栈的应用举例
数据结构
敲键盘的老乡3 小时前
堆优化版本的Prim
数据结构·c++·算法·图论·最小生成树
码农多耕地呗3 小时前
trie树-acwing
数据结构·c++·算法