数据结构第3天

这篇文章详细介绍了如何在C语言中使用双向链表结构,包括创建链表、头插法、尾插法、头删法、尾删法以及遍历链表。展示了主函数和封装函数的代码片段,展示了数据类型管理和链表操作的过程。
摘要由CSDN通过智能技术生成

双向链表

主函数

 #include <stdio.h>                                   
 #include "./doublefunc.h"                            
 int main(int argc, const char *argv[])               
 {                                                    
     doublelinkList *head=create_doublelinkList();    
     inserthead_doublelinklist(head,4);               
     inserthead_doublelinklist(head,5);               
     inserthead_doublelinklist(head,45);              
     inserthead_doublelinklist(head,445);             
     inserthead_doublelinklist(head,78);              
     inserthead_doublelinklist(head,15);              
     inserthead_doublelinklist(head,47);              
     show_doublelinkList(head);                       
     inserthend_doublelinklist(head,56);              
     show_doublelinkList(head);                       
     dataType s=deletehead_doublelinkList(head);      
     printf("删除%d\n",s);                            
     show_doublelinkList(head);                       
     insertbypos_doublelinklist(head,1,52);           
     insertbypos_doublelinklist(head,9,72);           
     show_doublelinkList(head);                       
     int sr=deletehend_doublelinkList(head);          
     printf("尾删%d\n",sr);                           
     show_doublelinkList(head);                       
     int ssr=deletebypos_doublelinklist(head,1);      
     printf("按位删%d\n",ssr);
     show_doublelinkList(head);                       
     return 0;                                        
 }                                                    
                                                      

封装函数

nclude <stdio.h>                                                                                                                    
nclude "./doublefunc.h"                                                                                                             
nclude <stdlib.h>                                                                                                                   
                                                                                                                                    
创建一个带头结点的空链表                                                                                                            
ublelinkList* create_doublelinkList()                                                                                               
                                                                                                                                    
  doublelinkList*head =(doublelinkList*)malloc(sizeof(doublelinkList));                                                             
  if(NULL==head)                                                                                                                    
  {                                                                                                                                 
      printf("头结点申请失败\n");                                                                                                   
      return NULL;                                                                                                                  
  }                                                                                                                                 
  head->text.len=0;                                                                                                                 
  head->next=NULL;                                                                                                                  
  head->prev=NULL;                                                                                                                  
                                                                                                                                    
  return head;                                                                                                                      
                                                                                                                                    
头插法                                                                                                                              
id inserthead_doublelinklist(doublelinkList*head,dataType num)                                                                      
                                                                                                                                    
  doublelinkList *temp=(doublelinkList*)malloc(sizeof(doublelinkList));                                                             
  if(NULL==temp)                                                                                                                    
  {                                                                                                                                 
      printf("插入失败\n");                                                                                                         
      return;                                                                                                                       
  }                                                                                                                                 
  temp->text.data=num;                                                                                                              
  temp->next=NULL;                                                                                                                  
  temp->prev=NULL;                                                                                                                  
  if(head->next==NULL)                                                                                                              
  {                                                                                                                                 
      temp->next=head->next;                                                                                                        
      temp->prev=head;                                                                                                              
      head->next=temp;                                                                                                              
  }                                                                                                                                 
  else                                                                                                                              
  {                                                                                                                                 
                                                                                                                                    
      temp->next=head->next;                                                                                                        
      temp->next->prev=temp;                                                                                                        
      temp->prev=head;                                                                                                              
      head->next=temp;                                                                                                              
  }                                                                                                                                 
  (head->text.len)++;                                                                                                               
  return ;                                                                                                                          
                                                                                                                                    
遍历输出                                                                                                                            
id show_doublelinkList(doublelinkList*head)                                                                                         
                                                                                                                                    
  doublelinkList *p=head;                                                                                                           
  while (p->next!=NULL)                                                                                                             
  {                                                                                                                                 
      p=p->next;                                                                                                                    
      printf("%d  ",p->text.data);                                                                                                  
                                                                                                                                    
  }                                                                                                                                 
  printf("\n");                                                                                                                     
  printf("长度%d\n",head->text.len);                                                                                                
                                                                                                                                    
尾插法                                                                                                                              
id inserthend_doublelinklist(doublelinkList*head,dataType num)                                                                      
                                                                                                                                    
  doublelinkList *temp=(doublelinkList*)malloc(sizeof(doublelinkList));                                                             
  if(NULL==temp)                                                                                                                    
  {                                                                                                                                 
      printf("插入失败\n");                                                                                                         
      return;                                                                                                                       
  }                                                                                                                                 
  temp->text.data=num;                                                                                                              
  temp->next=NULL;                                                                                                                  
  temp->prev=NULL;                                                                                                                  
  doublelinkList *p=head;                                                                                                           
  while(p->next!=NULL)                                                                                                              
  {                                                                                                                                 
      p=p->next;                                                                                                                    
  }                                                                                                                                 
  if(head->next==NULL)                                                                                                              
  {                                                                                                                                 
      temp->next=NULL;                                                                                                              
      temp->prev=p;                                                                                                                 
      p->next=temp;                                                                                                                 
  }                                                                                                                                 
  else                                                                                                                              
  {                                                                                                                                 
                                                                                                                                    
      temp->next=NULL;                                                                                                              
      temp->prev=p;                                                                                                                 
      p->next=temp;                                                                                                                 
  }                                                                                                                                 
                                                                                                                                    
  (head->text.len)++;                                                                                                               
  return ;                                                                                                                          
                                                                                                                                    
头删法                                                                                                                              
taType deletehead_doublelinkList(doublelinkList*head)                                                                               
                                                                                                                                    
  if(head->next==NULL)                                                                                                              
  {                                                                                                                                 
      printf("删除失败\n");                                                                                                         
      return (dataType)-1;                                                                                                          
  }                                                                                                                                 
  doublelinkList*p=head;                                                                                                            
  p=p->next;                                                                                                                        
  p->next->prev=head;                                                                                                               
  head->next=p->next;                                                                                                               
  dataType num=p->text.data;                                                                                                        
  free(p);                                                                                                                          
  p=NULL;                                                                                                                           
  head->text.len--;                                                                                                                 
  return (dataType)num;                                                                                                             
                                                                                                                                    
按位置插入                                                                                                                          
id insertbypos_doublelinklist(doublelinkList*head,int pos,dataType num)                                                             
                                                                                                                                    
  doublelinkList *temp=(doublelinkList*)malloc(sizeof(doublelinkList));                                                             
  if(NULL==temp)                                                                                                                    
  {                                                                                                                                 
      printf("插入失败\n");                                                                                                         
      return;                                                                                                                       
  }                                                                                                                                 
  temp->text.data=num;                                                                                                              
  temp->next=NULL;                                                                                                                  
  temp->prev=NULL;                                                                                                                  
  if(pos<1||pos>head->text.len+1)                                                                                                   
  {                                                                                                                                 
      printf("插入位置非法\n");                                                                                                     
      return;                                                                                                                       
  }                                                                                                                                 
  doublelinkList *p=head;                                                                                                           
  for(int i=0;i<pos-1;i++)                                                                                                          
  {                                                                                                                                 
      p=p->next;                                                                                                                    
  }                                                                                                                                 
  if(p->next==NULL)                                                                                                                 
  {                                                                                                                                 
      temp->next=p->next;                                                                                                           
      temp->prev=p;                                                                                                                 
      p->next=temp;                                                                                                                 
  }                                                                                                                                 
  else                                                                                                                              
  {                                                                                                                                 
                                                                                                                                    
      temp->next=p->next;                                                                                                           
      temp->next->prev=temp;                                                                                                        
      temp->prev=p;                                                                                                                 
      p->next=temp;                                                                                                                 
  }                                                                                                                                 
  (head->text.len)++;                                                                                                               
  return ;                                                                                                                          
                                                                                                                                    
                                                                                                                                    
尾删                                                                                                                                
taType deletehend_doublelinkList(doublelinkList*head)                                                                               
                                                                                                                                    
  if(head->next==NULL)                                                                                                              
  {                                                                                                                                 
      printf("删除失败\n");                                                                                                         
      return (dataType)-1;                                                                                                          
  }                                                                                                                                 
                                                                                                                                    
  doublelinkList*p=head;                                                                                                            
  while(p->next->next!=NULL)                                                                                                        
  {                                                                                                                                 
      p=p->next;                                                                                                                    
  }                                                                                                                                 
  dataType num=p->next->text.data;                                                                                                  
  free(p->next);                                                                                                                    
  p->next=NULL;                                                                                                                     
                                                                                                                                    
                                                                                                                                    
  head->text.len--;                                                                                                                 
  return (dataType)num;                                                                                                             
                                                                                                                                    
按照位置删除                                                                                                                        
taType deletebypos_doublelinklist(doublelinkList*head,int pos)                                                                      
                                                                                                                                    
                                                                                                                                    
  if(pos<1||pos>head->text.len)                                                                                                     
  {                                                                                                                                 
      printf("删除位置非法\n");                                                                                                     
      return (dataType)-1;                                                                                                          
  }                                                                                                                                 
  doublelinkList *p=head;                                                                                                           
  for(int i=0;i<pos-1;i++)                                                                                                          
  {                                                                                                                                 
      p=p->next;                                                                                                                    
  }                                                                                                                                 
  dataType num;                                                                                                                     
  if(p->next==NULL)                                                                                                                 
  {                                                                                                                                 
      num=p->next->text.data;                                                                                                       
      free(p->next);                                                                                                                
      p->next=NULL;                                                                                                                 
                                                                                                                                    
  }                                                                                                                                 
  else                                                                                                                              
  {                                                                                                                                 
      doublelinkList*s=p->next;                                                                                                     
      num=s->text.data;                                                                                                             
      s->next->prev=p;                                                                                                              
      p->next=s->next;                                                                                                              
      free(s);                                                                                                                      
      s=NULL;                                                                                                                       
  }                                                                                                                                 
  (head->text.len)--;                                                                                                               
  return (dataType)num;                                                                                                             
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    
                                                                                                                                    

头文件

#ifndef __func_H__
#define __func_H__
typedef int dataType;
union msg{
    dataType data;
    int len;
};
typedef struct node{
    union msg text;
    struct node *next;
    struct node *prev;
}doublelinkList;
doublelinkList*create_doublelinkList();
void inserthead_doublelinklist();
void show_doublelinkList();
void inserthend_doublelinklist();
dataType deletehead_doublelinkList();
void insertbypos_doublelinklist();
dataType deletehend_doublelinkList();
dataType deletebypos_doublelinklist();                
#endif

单向循环链表

主函数

#include <stdio.h>
#include "./func.h"
int main(int argc, const char *argv[])
{
    loopList*head=create_loopList();
    inserthead_looplist(head,1);
    inserthead_looplist(head,5);
    inserthead_looplist(head,9);
    inserthead_looplist(head,44);
    inserthead_looplist(head,145);
    show_loopList(head);
    insertend_looplist(head,45);
    show_loopList(head);
    dataType s=deletehead_loopList(head);
    show_loopList(head);
    printf("删除%d\n",s);
    dataType ss=deleteend_loopList(head);
    show_loopList(head);
    printf("尾删删除%d\n",ss);
    return 0;
}                                               
                                                

头文件

 
 #ifndef __func_H__
 #define __func_H__
 typedef int dataType;
 union msg{
     dataType data;
     int len;
 };
 typedef struct node{
     union msg text;
     struct node *next;
 }loopList;
 loopList*create_loopList();
 void inserthead_looplist();
 void show_loopList();
 void insertend_looplist();
 dataType deletehead_loopList();
 dataType deleteend_loopList();
 
 #endif                              
                                     

封装函数

#include <stdio.h>
#include "./func.h"
#include <stdlib.h>

//创建一个带头结点的空链表
loopList* create_loopList()
{
    loopList*head =(loopList*)malloc(sizeof(loopList));
    if(NULL==head)
    {
        printf("头结点申请失败\n");
        return NULL;
    }
    head->text.len;
    head->next=head;

    return head;
}
//头插法
void inserthead_looplist(loopList*head,dataType num)
{
    loopList *temp=(loopList*)malloc(sizeof(loopList));
    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_loopList(loopList*head)
{
    loopList *p=head;
    while (p->next!=head)
    {
        p=p->next;
        printf("%d  ",p->text.data);

    }
    printf("\n");
    printf("长度%d\n",head->text.len);
}
//尾插法
void insertend_looplist(loopList*head,dataType num)
{
    loopList *temp=(loopList*)malloc(sizeof(loopList));
    if(NULL==temp)
    {
        printf("失败\n");
        return;
    }
    temp->next=NULL;
    temp->text.data=num;
    loopList*p=head;
    while(p->next !=head)
    {
        p=p->next;
    }
    temp->next=p->next;
    p->next=temp;
    (head->text.len)++;
}
//头删法
dataType deletehead_loopList(loopList*head)
{
    loopList *p=head;
    p=p->next;
    head->next=p->next;
    dataType num=p->text.data;
    free(p);
    p=NULL;
    head->text.len--;
    return (dataType)num;
}
//尾删法
dataType deleteend_loopList(loopList*head)                                      
{
    loopList*p=head;
    while(p->next->next!=head)
    {
        p=p->next;
    }
    loopList*q=p->next;
    p->next=q->next;
    dataType num=q->text.data;
    free(q);
    q=NULL;
    head->text.len--;
    return (dataType)num;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值