第十二次作业——链表的操作

 功能函数

#include <stdio.h>                                                      
#include <stdlib.h>                                                     
#include "3_linlist.h"                                                  
/*                                                                      
 * function:    创建一个单向链表                                        
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
linklist* create_linklist(void)                                         
{                                                                       
    linklist * head=(linklist*)malloc(sizeof(linklist));                
    if(NULL==head)                                                      
    {                                                                   
        printf("空间申请失败\n");                                       
        return NULL;                                                    
    }                                                                   
    head->data.len = 0;                                                 
    head->next = NULL;                                                  
    return head;                                                        
}                                                                       
/*                                                                      
 * function:    写入数据(头插法)                                        
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
void insert_linklist(linklist *head,datatype num)                       
{                                                                       
    linklist*temp=(linklist*)malloc(sizeof(linklist));                  
    if(NULL==temp)                                                      
    {                                                                   
        printf("申请结点失败");                                         
        return;                                                         
    }                                                                   
    temp->next=NULL;                                                    
    temp->data.text=num;                                                
    temp->next=head->next;                                              
                                                                        
    head->next=temp;                                                    
    head->data.len++;                                                   
}                                                                       
/*                                                                      
 * function:    遍历链表                                                
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
void show_linklist(linklist*head)                                       
{                                                                       
    linklist *p=head;                                                   
    printf("现存数据\n");                                               
    while(p->next!=NULL)                                                
    {                                                                   
        p=p->next;                                                      
        printf("%d\t",p->data.text);                                    
    }                                                                   
    printf("\n");                                                       
    return;                                                             
                                                                        
}                                                                       
/*                                                                      
 * function:    尾插法                                                  
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
void insertw_linklist(linklist*head,datatype num)                       
{                                                                       
    linklist *temp=(linklist*)malloc(sizeof(linklist));                 
    linklist *p=head;                                                   
    if(NULL==temp)                                                      
    {                                                                   
        printf("尾插结点申请失败");                                     
        return;                                                         
    }                                                                   
    while(p->next!=NULL)                                                
    {                                                                   
        p=p->next;                                                      
    }                                                                   
    p->next=temp;                                                       
    temp->data.text=num;                                                
    temp->next=NULL;                                                    
    head->data.len++;                                                   
    return;                                                             
}                                                                       
/*                                                                      
 * function:    头删法                                                  
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
void head_delete_linklist(linklist *head,int n)                         
{                                                                       
    linklist *p=head;                                                   
    if(NULL==p->next)                                                   
    {                                                                   
        printf("链表为空");                                             
        return;                                                         
    }                                                                   
    if(head->data.len<n)                                                
    {                                                                   
        printf("链表过短重新输入删除个数\n");                           
        return;                                                         
    }                                                                   
    p=p->next;                                                          
//  free(p);                                                            
//  p=p->next;                                                          
    for(int i=0;i<n;i++)                                                
    {                                                                   
        free(p);                                                        
        p=p->next;                                                      
        head->data.len--;                                               
    }                                                                   
    head->next=p;                                                       
    return;                                                             
}                                                                       
/*                                                                      
 * function:    尾删法                                                  
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
datatype delete_wei_linklist(linklist*head)                             
{                                                                       
    if(NULL==head->next)                                                
    {                                                                   
        printf("链表为空");                                             
        return (datatype)(-1);                                          
    }                                                                   
    int i=0;                                                            
    linklist *p=head;                                                   
    while(p->next->next!=NULL)                                          
    {                                                                   
        p=p->next;                                                      
    }                                                                   
    datatype num=p->next->data.text;                                    
    free(p->next);                                                      
    p->next=NULL;                                                       
    head->data.len--;                                                   
    return num;                                                         
}                                                                       
/*                                                                      
 * function:  按位置插入                                                
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
void insert_adr_linklist(linklist *head,int adr,datatype num)           
{                                                                       
    if(adr>head->data.len+1)                                            
    {                                                                   
        printf("位置错误");                                             
        return;                                                         
    }                                                                   
    linklist *temp=(linklist*)malloc(sizeof(linklist));                 
    linklist *p=head;                                                   
    int i=0;                                                            
    for(i;i<adr-1;i++)                                                  
    {                                                                   
        p=p->next;                                                      
    }                                                                   
    temp->data.text=num;                                                
    temp->next=p->next;                                                 
    p->next=temp;                                                       
    head->data.len++;                                                   
    return;                                                             
}                                                                       
/*                                                                      
 * function:    按位置删除                                              
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
datatype delete_adr_linklist(linklist *head,int adr)                    
{                                                                       
   if(NULL==head->next)                                                 
   {                                                                    
    printf("链表为空");                                                 
    return (datatype)(-1);                                              
   }                                                                    
   int i=0;                                                             
   linklist *p=head;                                                    
   linklist *p1=NULL;                                                   
    while(p->next!=NULL)                                                
    {                                                                   
        p=p->next;                                                      
        i++;                                                            
    }                                                                   
    p=head;                                                             
    if(adr>i)                                                           
    {                                                                   
        printf("插入位置错误");                                         
        return (datatype)(0);                                           
    }                                                                   
    for(i=0;i<adr;i++)                                                  
    {                                                                   
        p=p->next;                                                      
    }                                                                   
    datatype num;                                                       
    num=p->next->data.text;                                             
    free(p->next);                                                      
    p->next=p->next->next;                                              
    head->data.len--;                                                   
    return num;                                                         
}                                                                       
/*                                                                      
 * function:   按位置查找数据                                           
 * @param [ in]                                                         
 * @param [out]                                                         
 * @return                                                              
 */                                                                     
datatype find_linklist(linklist *head,int adr)                          
{                                                                       
    if(NULL==head->next)                                                
    {                                                                   
        printf("链表为空");                                             
        return (datatype)(-1);                                          
    }                                                                   
    if(adr>head->data.len)                                              
    {                                                                   
        printf("查询位置错误");                                         
        return (datatype)(0);                                           
    }                                                                   
    int i=0;                                                            
    linklist *p=head;                                                   
    for(i;i<adr;i++)                                                    
    {                                                                   
        p=p->next;                                                      
    }                                                                   
    int num=p->data.text;                                               
    return num;                                                         
}                                                                       

主函数

#include <stdio.h>
#include <stdlib.h>
#include "3_linlist.h"

int main(int argc, const char *argv[])
{
    datatype num;
    linklist *head=create_linklist();
    insert_linklist(head,1);
    insert_linklist(head,2);
    insert_linklist(head,3);
    insertw_linklist(head,44);
    insertw_linklist(head,45);
    insertw_linklist(head,48);
    show_linklist(head);
    num=delete_wei_linklist(head);
    printf("删除内容为num=%d\n",num);
    num=delete_adr_linklist(head,2);
    printf("按位置删除的num=%d\n",num);
    show_linklist(head);
    insert_linklist(head,46);
    insert_linklist(head,47);
    insert_linklist(head,49);    
    num=find_linklist(head,3);
    show_linklist(head);
    printf("按位查找的数据num=%d\n",num);
        return 0;
}                                                                                                                   

头文件

#ifndef  __linLIST__                                            
#define  __linLIST__                                            
typedef int datatype;                                           
typedef struct node{                                            
                                                                
    union{                                                      
    datatype text;                                              
    int len;                                                    
    }data;                                                      
    struct node *next;                                          
                                                                
}linklist;                                                      
                                                                
linklist* create_linklist(void);                                
void insert_linklist(linklist *head,datatype num);              
void show_linklist(linklist*head);                              
void insertw_linklist(linklist*head,datatype num);              
void head_delete_linklist(linklist *head,int n);                
void insert_adr_linklist(linklist *head,int adr,datatype num);  
datatype delete_wei_linklist(linklist*head);                    
datatype delete_adr_linklist(linklist *head,int adr);           
                                                                
datatype find_linklist(linklist *head,int adr);                 
#endif                                                          
                                                                
                                                                

运行结果 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值