2-21练习题

一、双向链表:创建双链表、从头部插入数据、从尾部插入数据、任意位置插入数据、从头部删除、从尾部删除、从任意位置删除、遍历双链表、判段链表是否为空

1、03_linklist.c

#include <stdio.h>                                                                                     
#include <stdlib.h>                                                                                    
#include "./03_linklist.h"                                                                             
doublelinklist* create_doubleLInklist(void)                                                            
{                                                                                                      
    doublelinklist* head = (doublelinklist*)malloc(sizeof(doublelinklist));                            
    if(NULL == head)                                                                                   
    {                                                                                                  
        printf("申请空间失败,创建链表失败\n");                                                        
        return NULL;                                                                                   
    }                                                                                                  
    head->next = NULL;                                                                                 
    head->prev = NULL;                                                                                 
    head->text.len = 0;                                                                                
    return head;                                                                                       
}                                                                                                      
                                                                                                       
//头插                                                                                                 
void head_Insertlinklist(doublelinklist* head,dataType num)                                            
{                                                                                                      
    doublelinklist* p = head;                                                                          
    doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));                            
    if(NULL == temp)                                                                                   
    {                                                                                                  
        printf("申请空间失败!");                                                                       
        return;                                                                                        
    }                                                                                                  
    temp->text.data = num;                                                                             
    temp->next = NULL;                                                                                 
    temp->prev = NULL;
    //链表为空和链表中有数据时头插位置不一样
    if(Empty(head) == 1)
    {
        temp->next = p->next;
        p->next = temp;
        temp->prev = p;
    }
    else
    {
        temp->next = p->next;
        p->next = temp;
        temp->prev = p;
        temp->next->prev = temp;
    }                                                                                                  
    head->text.len++;

}
//判空(空:1,不空:0)
int Empty(doublelinklist* head)
{
    if(NULL == head->next)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
//尾插
void tail_InsertLinklist(doublelinklist* head,dataType num)
{
    doublelinklist* p = head;
    doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));
    if(NULL == temp)
    {
        printf("申请空间失败!");
        return;
    }
    temp->text.data = num;
    temp->next = NULL;
    temp->prev = NULL;
    if(1 == Empty(head))//空链表
    {
        temp->next = p->next;
        p->next = temp;
    //  temp->next = NULL;
        temp->prev = p;
    }
    else
    {
        //遍历出最后一个元素位置
        while(p->next!= NULL)
        {
            p=p->next;                                                                                 
        }                                                                                              
        temp->next = p->next;                                                                          
        p->next = temp;                                                                                
    //  temp->next = NULL;                                                                             
        temp->prev = p;                                                                                
    }                                                                                                  
    head->text.len++;                                                                                  
                                                                                                       
                                                                                                       
}                                                                                                      
//遍历
void show_doubleLinklist(doublelinklist* head)                                                                   
{                                                                                                                
    doublelinklist* p = head;                                                                                    
    while(NULL != p->next)                                                                                       
    {                                                                                                            
        p=p->next;                                                                                               
        printf("%d ",p->text.data);                                                                              
    }                                                                                                            
    printf("\n");
}                                                                                                                
//按位置插入                                                                                                     
void insertDouobleLinklist(doublelinklist* head,int n,dataType num)                                              
{                                                                                                                
    doublelinklist* p = head;                                                                                    
    int i;                                                                                                       
                                                                                                                 
    doublelinklist* temp = (doublelinklist*)malloc(sizeof(doublelinklist));                                      
    if(NULL == temp)                                                                                             
    {                                                                                                            
        printf("申请空间失败!");                                                                                 
        return;                                                                                                  
    }                                                                                                            
    if(n<1 && n>head->text.len+1)                                                                                
    {                                                                                                            
        printf("插入位置非法,插入失败\n");                                                                      
        return;                                                                                                  
    }                                                                                                            
    for(i=0;i<n-1;i++)                                                                                           
    {                                                                                                            
        p=p->next;                                                                                               
    }                                                                                                            
                                                                                                                 
    temp->text.data = num;                                                                                       
    temp->next = NULL;                                                                                           
    temp->prev = NULL;                                                                                           
                                                                                                                 
    if(p->next == NULL)                                                                                          
    {                                                                                                            
        temp->next = p->next;                                                                                    
        p->next = temp;                                                                                          
        temp->prev = p;                                                                                          
    }                                                                                                            
    else                                                                                                         
    {                                                                                                            
        temp->next = p->next;                                                                                    
        p->next = temp;                                                                                          
        temp->next->prev = temp;                                                                                 
        temp->prev = p;                                                                                          
    }                                                                                                            
    head->text.len++;                                                                                            
}                                                                                                                
                                                                                                                 
//头删                                                                                                           
void head_DeleteDoubleLinklist(doublelinklist* head)                                                             
{                                                                                                                
    doublelinklist* p = head;                                                                                    
    doublelinklist* q = p->next;                                                                                 
    if(NULL == p->next)                                                                                          
    {                                                                                                            
        printf("该链表为空,无法进行删除操作\n");                                                                
        return;                                                                                                  
    }                                                                                                            
    if(q->next == NULL)                                                                                          
    {                                                                                                            
        p->next = q->next;                                                                                       
        free(p);                                                                                                 
    }                                                                                                            
    else                                                                                                         
    {                                                                                                            
        p->next = q->next;                                                                                       
        q->next->prev = p;                                                                                       
        free(q);                                                                                                 
    }                                                                                                            
    printf("头删成功\n");                                                                                        
    head->text.len--;                                                                                            
}                                                                                                                
//尾删                                                                                                                  
void tail_DeleteDoubleLinklist(doublelinklist* head)                                                                    
{                                                                                                                       
    doublelinklist* p = head;                                                                                           
    if(NULL == p->next)                                                                                                 
    {                                                                                                                   
        printf("该链表为空,无法进行删除操作\n");                                                                       
        return;                                                                                                         
    }                                                                                                                   
    while(p->next != NULL)                                                                                              
    {
        p = p->next;
    }                                                                                                                   
    p->prev->next = NULL;                                                                                               
    free(p);                                                                                                            
    head->text.len--;                                                                                                   
    printf("尾删成功\n");                                                                                               
                                                                                                                        
}                                                                                                                       
//按位置删除                                                                                                            
void deleteDoubleLinklist(doublelinklist* head,int n)                                                                   
{
    doublelinklist* p = head;                                                                                           
    if(NULL == p->next)                                                                                                 
    {                                                                                                                   
        printf("该链表为空,无法进行删除操作\n");                                                                       
        return;                                                                                                         
    }                                                                                                                   
    int i;                                                                                                              
    for(i=0;i<n;i++)                                                                                                    
    {                                                                                                                   
        p = p->next;                                                                                                    
    }                                                                                                                   
    if(p->next == NULL)                                                                                                 
    {                                                                                                                   
        p->prev->next = p->next;                                                                                        
        free(p);                                                                                                        
    }                                                                                                                   
    else                                                                                                                
    {                                                                                                                   
        p->prev->next = p->next->next;                                                                                  
        p->next->prev = p->prev;                                                                                        
        free(p);                                                                                                        
    }                                                                                                                   
    head->text.len--;                                                                                                   
    printf("按位删除成功\n");                                                                                           
                                                                                                                        
}                                                                                                                       
                                                                                                                        
                                                                                                                        

 2、03_main.c

#include <stdio.h>                                      
#include "./03_linklist.h"                              
int main(int argc, const char *argv[])                  
{                                                       
    doublelinklist* head = create_doubleLInklist();     
    head_Insertlinklist(head,2);                        
    tail_InsertLinklist(head,3);                        
    tail_InsertLinklist(head,4);                        
    tail_InsertLinklist(head,5);                        
                                                        
    show_doubleLinklist(head);                          
    //按位置插入                                        
    insertDouobleLinklist(head,3,4);                    
    show_doubleLinklist(head);                          
    //头删                                              
    head_DeleteDoubleLinklist(head);                    
    //尾删                                              
    tail_DeleteDoubleLinklist(head);                    
    //按位置删除                                        
    deleteDoubleLinklist(head,3);                       
                                                        
    return 0;                                           
}                                                       
                                                        
                                                        
                                                        

  3、03_linklist.h

#ifndef __LINKLIST_H__                                                      
#define __LINKLIST_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);                                
//头插                                                                      
void head_Insertlinklist(doublelinklist* head,dataType num);                
//尾插                                                                      
void tail_InsertLinklist(doublelinklist* head,dataType num);                
//遍历                                                                      
void show_doubleLinklist(doublelinklist* head);                             
//判空(空:1,不空:0)                                                    
int Empty(doublelinklist* head);                                            
//按位置插入                                                                
void insertDouobleLinklist(doublelinklist* head,int n,dataType num);        
//按位置删除                                                                
void deleteDoubleLinklist(doublelinklist* head,int n);                      
//尾删                                                                      
void tail_DeleteDoubleLinklist(doublelinklist* head);                       
//头删                                                                      
void head_DeleteDoubleLinklist(doublelinklist* head);                       
                                                                            
                                                                            
                                                                            
#endif                                                                      
                                                                            
                                                                            

二、单循环链表:创建单向循环链表、头插链表、尾插链表、按位置插入链表、按位置查找链表、头删、尾删、遍历链表、判断链表是否为空

1、02_linklist.c

#include <stdio.h>                                                                          
#include <stdlib.h>                                                                         
#include "./02_linklist.h"                                                                  
//创建单向循环链表                                                                          
looplinklist* create_Looplinklist(void)                                                     
{                                                                                           
    looplinklist* head = (looplinklist*) malloc(sizeof(looplinklist));                      
    if(NULL == head)                                                                        
    {                                                                                       
        printf("节点创建失败,链表创建失败\n");                                             
        return NULL;                                                                        
    }                                                                                       
    //初始化                                                                                
    head->text.len=0;                                                                       
    //循环链表初始化头结点的next指向自身                                                    
    head->next = head;                                                                      
    return head;                                                                            
}                                                                                           
//头插                                                                                      
void head_InsertLooplinklist(looplinklist* head,dataType num)                               
{                                                                                           
    looplinklist* temp = (looplinklist*) malloc(sizeof(looplinklist));                      
    if(NULL == temp)                                                                        
    {                                                                                       
        printf("创建节点失败!\n");                                                          
        return;                                                                             
    }                                                                                       
    //初始化节点                                                                            
    temp->text.data = num;                                                                  
    temp->next = NULL;                                                                      
    looplinklist* p = head;                                                                 
    temp->next = p->next;                                                                   
    p->next = temp;                                                                         
    head->text.len++;                                                                       
}                                                                                           
//尾插                                                                                      
void tail_InsertLoopLinklist(looplinklist* head,dataType num)                               
{                                                                                           
    looplinklist* temp = (looplinklist*)malloc(sizeof(looplinklist));                       
    if(NULL == temp)                                                                        
    {                                                                                       
        printf("创建节点失败!\n");                                                          
        return;                                                                             
    }                                                                                       
    //初始化节点                                                                            
    temp->text.data = num;                                                                  
    temp->next = NULL;                                                                      
                                                                                            
    looplinklist* p = head;                                                                 
    while(p->next!=head)                                                                    
    {                                                                                       
        p=p->next;                                                                          
    }                                                                                       
    p->next = temp;                                                                         
    temp->next = head;                                                                      
    head->text.len++;                                                                       
}                                                                                           
//遍历                                                                                      
void show_Looplinklist(looplinklist* head)                                                  
{                                                                                           
    looplinklist* p = head;                                                                 
    while(p->next!=head)                                                                    
    {                                                                                       
        p=p->next;                                                                          
        printf("%d ",p->text.data);                                                         
    }                                                                                       
    printf("\n");                                                                           
}                                                                                           
//判空                                                                                      
int Empty(looplinklist* head)                                                               
{                                                                                           
    looplinklist* p = head;                                                                 
    if(p->next == head)                                                                     
    {                                                                                       
        return 1;                                                                           
    }                                                                                       
    else                                                                                    
    {                                                                                       
        return 0;                                                                           
    }                                                                                       
}                                                                                           
//头删                                                                                      
void head_deletLoopLinklist(looplinklist* head)                                             
{                                                                                           
    looplinklist* p = head;                                                                 
    looplinklist* q = head->next;                                                           
    if(Empty(head) == 1)                                                                    
    {                                                                                       
        printf("此单向循环链表为空,无法进行删除操作\n");                                   
        return;                                                                             
    }                                                                                       
    p->next = q->next;                                                                      
    free(q);                                                                                
    q=NULL;                                                                                 
    head->text.len--;
    printf("头删完成\n");                                                                   
    
}                                                                                           
//尾删
void tail_deleteLoopLinklist(looplinklist* head)                                  
{                                                                                 
    looplinklist* p = head;                                                       
    if(Empty(head) == 1)                                                          
    {                                                                             
        printf("此单向循环链表为空,无法进行删除操作\n");                         
        return;                                                                   
    }                                                                             
    while(p->next->next!=head)                                                    
    {                                                                             
        p=p->next;                                                                
    }                                                                             
    looplinklist* q = p->next;                                                    
    p->next = q->next;                                                            
    free(q);                                                                      
    head->text.len--;                                                             
    printf("尾删完成\n");                                                         
    q=NULL;                                                                       
}                                                                                 
//定位插入                                                                        
void insert_LoopLinklist(looplinklist* head,dataType num,int n)                   
{                                                                                 
    looplinklist* temp = (looplinklist*)malloc(sizeof(looplinklist));             
    if(NULL == temp)                                                              
    {                                                                             
        printf("申请空间失败,创建新节点失败\n");                                 
        return;                                                                   
    }                                                                             
    //初始化新节点                                                                
    temp->text.data = num;                                                        
    temp->next = NULL;                                                            
    looplinklist* p = head;                                                       
    int i;                                                                        
    for(i=0;i<n;i++)                                                              
    {                                                                             
        p=p->next;                                                                
    }                                                                             
    if(NULL == p->next)                                                           
    {                                                                             
        p->next = temp;                                                           
        temp->next = head;                                                        
    }                                                                             
    else                                                                          
    {                                                                             
        temp->next = p->next;                                                     
        p->next = temp;                                                           
                                                                                  
    }                                                                             
    head->text.len++;                                                             
}                                                                                 
//定位查看                                                                        
void select_LoopLinklist(looplinklist* head,int n)                                
{                                                                                 
    looplinklist* p = head;                                                       
    int i;                                                                        
    for(i=0;i<n;i++)                                                              
    {                                                                             
        p = p->next;                                                              
    }                                                                             
    printf("查看的第%d为元素值为:%d\n",n,p->text.data);                           
    p=NULL;                                                                       
}                                                                                 
//                                                                                
 //                                                                                                
 //约瑟夫问题                                                                                      
 void joseph(looplinklist* head,int n,int m,int k)                                                 
 {                                                                                                 
     looplinklist* p = head;                                                                       
     looplinklist* p1 = head;                                                                      
     looplinklist* q = NULL;                                                                       
     //删除头结点                                                                                  
     if (p == head)                                                                                
     {                                                                                             
         if (head->next == head)                                                                   
         { // 只有一个节点的情况                                                                   
             free(head);                                                                           
             head = NULL;                                                                          
         }                                                                                         
         else                                                                                      
         {                                                                                         
             p1 = head;                                                                            
             while (p1->next != head)                                                              
             {                                                                                     
                 p1 = p1->next;                                                                    
             }                                                                                     
             p1->next = head->next;                                                                
             free(head);                                                                           
             head = p1->next;                                                                      
         }                                                                                         
     }                                                                                             
     //p2指向新的头节点                                                                            
     looplinklist* p2 = head;                                                                      
     //循环                                                                                        
     int i;                                                                                        
     //p2定位到数据3,开始的地方                                                                   
     for(i=1;i<k;i++)                                                                              
     {                                                                                             
         q = p2;                                                                                   
         p2 = p2->next;                                                                            
     }                                                                                             
                                                                                                   
     while(n>0)                                                                                    
     {                                                                                             
         for(i=1;i<m;i++)//6                                                                       
         {                                                                                         
             q = p2;                                                                               
             p2 = p2->next;                                                                        
         }                                                                                         
         printf("%d ",p2->text.data);                                                              
         if(p2 == q)                                                                               
         {                                                                                         
             head = NULL;                                                                          
         }                                                                                         
         else                                                                                      
         { //删除节点                                                                              
             q->next = p2->next;                                                                   
             head = p2->next;                                                                      
         }                                                                                         
         free(p2);                                                                                 
         p2 = head;                                                                                
         n--;                                                                                      
     }                                                                                             
     printf("\n");                                                                                 
 }                                                                                                 
                                                                                                   
                                                                                                   
                                                                                                   
                                                                                                   
                                                                                                   
                                                                                                   

2、02_main.c

#include <stdio.h>                                                   
#include <stdlib.h>                                                  
#include "./02_linklist.h"                                           
int main(int argc, const char *argv[])                               
{                                                                    
                                                                     
    //创建单项循环链表                                               
    looplinklist* head = create_Looplinklist();                      
    //头插                                                           
    int i=1;                                                         
    for(i=8;i>=1;i--)                                                
    {                                                                
        head_InsertLooplinklist(head,i);                             
    }                                                                
                                                                     
    //遍历                                                           
    show_Looplinklist(head);                                         
    //尾插                                                           
//  tail_InsertLoopLinklist(head,12);                                
//  show_Looplinklist(head);                                         
    //头删                                                           
//  head_deletLoopLinklist(head);                                    
//  show_Looplinklist(head);                                         
//  joseph(head,8,4,3);                                              
    //尾删                                                           
    tail_deleteLoopLinklist(head);                                   
    //定位插入                                                       
    insert_LoopLinklist(head,12,5);                                  
    show_Looplinklist(head);                                         
    //定位查看                                                       
    select_LoopLinklist(head,5);                                     
                                                                     
                                                                     

3、02_linklist.h

#ifndef __LINKLIST_H__                                                
#define __LINKLIST_H__                                                
                                                                      
typedef int dataType;                                                 
union msg                                                             
{                                                                     
    dataType data;                                                    
    int len;                                                          
};                                                                    
typedef struct node                                                   
{                                                                     
    union msg text;                                                   
    struct node* next;                                                
}looplinklist;                                                        
//创建单向循环链表                                                    
looplinklist* create_Looplinklist(void);                              
//头插                                                                
void head_InsertLooplinklist(looplinklist* head,dataType num);        
//遍历                                                                
void show_Looplinklist(looplinklist* head);                           
//尾插                                                                
void tail_InsertLoopLinklist(looplinklist* head,dataType num);        
//头删                                                                
void head_deletLoopLinklist(looplinklist* head);                      
//约瑟夫问题                                                          
void joseph(looplinklist* head,int n,int m,int k);                    
//尾删                                                                
void tail_deleteLoopLinklist(looplinklist* head);                     
//定位插入                                                            
void insert_LoopLinklist(looplinklist* head,dataType num,int n);      
//定位查看                                                            
void select_LoopLinklist(looplinklist* head,int n);                   
                                                                      
#endif                                                                
                                                                      
                                                                      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值