【数据结构】链表

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

一、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

六、运行结果

相关推荐
程序员-King.1 小时前
day143—递归—对称二叉树(LeetCode-101)
数据结构·算法·leetcode·二叉树·递归
仙俊红4 小时前
LeetCode174双周赛T3
数据结构·算法
仍然.4 小时前
JavaDataStructure---二叉搜索树,哈希表,Map和Set
数据结构·散列表
程序员-King.5 小时前
链表——算法总结与新手教学指南
数据结构·算法·链表
FMRbpm6 小时前
树的练习6--------938.二叉搜索树的范围和
数据结构·c++·算法·leetcode·职场和发展·新手入门
多米Domi0116 小时前
0x3f 第35天 电脑硬盘坏了 +二叉树直径,将有序数组转换为二叉搜索树
java·数据结构·python·算法·leetcode·链表
凯子坚持 c8 小时前
C++大模型SDK开发实录(一):spdlog日志封装、通用数据结构定义与策略模式应用
数据结构·c++·sdk·策略模式
漫随流水8 小时前
leetcode算法(513.找树左下角的值)
数据结构·算法·leetcode·二叉树
全栈游侠9 小时前
数据结构 -数组
数据结构
天赐学c语言10 小时前
1.18 - 滑动窗口最大值 && 子类的指针转换为父类的指针,指针的值是否会改变
数据结构·c++·算法·leecode