2月21作业

单链表

#include <stdio.h>
#include "./fun.h"
int main(int argc, const char *argv[])
{
    datatype num;
    linkList* head=create_linkList();
    insertHead_linkList(head,100);
    insertHead_linkList(head,10);
    insertHead_linkList(head,199);
    insertHead_linkList(head,79);
    insertHead_linkList(head,23);
    show_linkList(head);
    printf("-----------------------------\n");
    /*insertTail_linkList(head,45);
    insertTail_linkList(head,67);
    insertTail_linkList(head,89);
    insertTail_linkList(head,12);
    show_linkList(head);
    printf("len=%d\n",head->text.len);
    printf("-----------------------------\n");
    num=deleteHead_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    num=deleteHead_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    num=deleteTail_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    num=deleteTail_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    show_linkList(head);
    printf("----------------------------\n");
    insertPos_linkList(head,1,234);
    show_linkList(head);
    insertPos_linkList(head,10,24);
    insertPos_linkList(head,5,23);
    show_linkList(head);
    printf("---------------------------\n");
    deleteBypos_linkList(head,3);
    show_linkList(head);
    printf("---------------------------\n");
    insertSort_linkList(head,23);
    insertSort_linkList(head,560);
    insertSort_linkList(head,43);
    insertSort_linkList(head,12);
    reserve_linkList(head);
    show_linkList(head);*/
    num=middleNode_linkList(head);
    printf("%d\n",num);

    return 0;
}

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

//创建一个带头结点的空的单链表
linkList* create_linkList()
{
    linkList* head=(linkList*)malloc(sizeof(linkList));
    if(NULL == head)
    {
        printf("头结点申请失败,创建单链表失败\n");
        return NULL;
    }
    head->text.len=0;    //初始化头结点中链表长度为0
    head->next=NULL;     //初始化头结点中的指针域为NULL
    return head;
}
//判断链表是否为空
int isEmpty_linkList(linkList* head)
{
    return head->next == NULL?1:0;
}
//头插法插入数据
int insertHead_linkList(linkList* head,datatype num)
{
        //创建一个新的结点
        linkList* temp=(linkList*)malloc(sizeof(linkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");
            return -1;    
        }
        temp->text.data = num;
        temp->next = NULL;
        
        //头插法插入数据
        temp->next=head->next;        
        head->next=temp;

        head->text.len++;
        return 0;
}

//遍历
void show_linkList(linkList* head)
{
    linkList* p=head;
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d ",p->text.data);
    }
    printf("\n");

}

//从尾结点插入数据
int insertTail_linkList(linkList* head,datatype num)
{
        //创建一个新的结点
        linkList* temp=(linkList*)malloc(sizeof(linkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");
            return -1;
        }
        //初始化新的结点
        temp->next = NULL;
        temp->text.data = num;

        //尾插法插入数据
        //找到链尾表的尾结点
        linkList* p=head;
        while(p->next!=NULL)
        {
            p = p->next;
        }
              
        p->next=temp;
        temp->next=NULL;
        //更新头结点中记录的链表长度
        head->text.len++;
        return 0;
}

//从头结点删除
datatype deleteHead_linkList(linkList* head)
{
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }
    //头删法删除
    linkList* temp= head->next;
    head->next = temp->next;
    //宁存要删除的结点中的所有有效数据,然后释放结点
    datatype num = temp->text.data;
    free(temp);
    temp=NULL;

    //更新头结点中记录的链表长度
    head->text.len--;
    return num;
}
//从尾点删除
datatype deleteTail_linkList(linkList* head)
{
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }

    linkList* temp= head;   //让temp指向头结点

    //循环找到倒数第2个结点
    while(temp->next->next!=NULL)
    {
        temp = temp->next;//向后移动一个
    }
    //上述循环结束后,找到了倒数第2个结点
    datatype num=temp->next->text.data;
    free(temp->next);
    temp->next=NULL;

    //更新头结点中记录的链表长度
    head->text.len--;
    return num;
}

//按位置插入数据
void insertPos_linkList(linkList* head,int pos,datatype num)
{
    //判断插入的位置是否合法
    if(pos<1 || pos>head->text.len+1)
    {
        printf("pos=%d 插入位置非法,插入失败\n",pos);
        return ;
    }
    //循环查找要插入位置的前一个节点位置
    linkList* p=head;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }//上述循环完毕后,p只想要插入位置的前一个节点

    //创建一个新的节点插入到链表中
    linkList* temp=(linkList*)malloc(sizeof(linkList));
    if(NULL == temp)
    {
        printf("结点申请失败,头插失败\n");
    }
    temp->text.data=num;
    temp->next=NULL;

    //插入节点
    temp->next=p->next;
    p->next=temp;

    //更新头结点中记录的链表长度
    head->text.len++;

    return ;
}

//按照位置删除数据,位置编号从1开始
datatype deleteBypos_linkList(linkList* head,int pos)
{
        //判断链表是否为空
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }

//判断和\删除的位置是否合法
    if(pos<1 || pos>head->text.len)
    {
        printf("pos=%d 插入位置非法,插入失败\n",pos);
        return(datatype)-1;
    }

    //循环查找要删除位置的前一个节点位置
    linkList* p=head;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }//上述循环完毕后,p只想要删除位置的前一个节点

    //修改指向,释放要删除的节点
    linkList* temp=p->next;          //宁存要删除的结点中的地址
    p->next=temp->next;

    datatype num=temp->text.data;
    free(temp);
    temp=NULL;
    
    //更新头结点中记录的链表长度
    head->text.len--;
    return num;
}

void insertSort_linkList(linkList* head,datatype num)
{
    //创建一个新的节点插入到链表中
    linkList* temp=(linkList*)malloc(sizeof(linkList));
    if(NULL == temp)
    {
        printf("结点申请失败,头插失败\n");
    }
    temp->text.data=num;
    temp->next=NULL;
    
    linkList* p=head; //遍历链表,找到比num大的结点前一个位置

    while(p->next !=NULL)
    {
        if(p->next->text.data>temp->text.data)
        {
            break;
        }
        else
        {
            p=p->next;
        }
    }
    temp->next=p->next;
    p->next=temp;

    //更新头结点中记录的链表长度
    head->text.len++;
}

datatype middleNode_linkList(linkList* head)
{
    //判断链表是否为空
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }
    linkList* fast,*low;
    fast=low=head->next;
    int flag=0;
    while(fast!=NULL&&fast->next!=NULL)
    {
        low=low->next;
        fast=fast->next->next;
        flag=1;
    }
    if(1==flag)
        return low->text.data;
    else
        return -1;

}

#ifndef __FUN_H__
#define __FUN_H__
typedef int datatype;
union msg{
    datatype data;
    int len;
};
typedef struct node{
    union msg text;
    struct node *next;
}linkList;
linkList* create_linkList();
int insertHead_linkList(linkList* head,datatype num);
void show_linkList(linkList* head);
int insertTail_linkList(linkList* head,datatype num);
datatype deleteHead_linkList(linkList* head);
datatype deleteTail_linkList(linkList* head);
void insertPos_linkList(linkList* head,int pos,datatype num);
datatype deleteBypos_linkList(linkList* head,int pos);
void insertSort_linkList(linkList* head,datatype num);
void reserve_linkList(linkList* head);
datatype middleNode_linkList(linkList* head);


#endif

单循环链表

#include <stdio.h>
#include <stdlib.h>
#include "./fun.h"
int main(int argc, const char *argv[])
{
    datatype num;
    looplinkList* head=create_looplinkList();
    insertHead_looplinkList(head,10);
    insertHead_looplinkList(head,89);
    insertHead_looplinkList(head,45);    
    show_looplinkList(head);
    printf("--------------------------------\n");
    insertTail_looplinkList(head,60);
    insertTail_looplinkList(head,78);
    insertTail_looplinkList(head,60);
    show_looplinkList(head);
    printf("--------------------------------\n");
    num=deleteHead_looplinkList(head);
    printf("头结点删除的是:%d\n",num);
    show_looplinkList(head);
    printf("--------------------------------\n");
     datatype n=deleteTail_looplinkList(head);
    printf("头尾删除的是:%d\n",n);
    show_looplinkList(head);

    return 0;
}

#ifndef __FUN_H__
#define __FUN_H__
typedef int datatype;
union msg{
    datatype data;
    int len;
};
typedef struct node{
    union msg text;
    struct node *next;
}looplinkList;
looplinkList* create_looplinkList();
int insertHead_looplinkList(looplinkList* head,datatype num);

void show_looplinkList(looplinkList* head);
int insertTail_looplinkList(looplinkList* head,datatype num);
datatype deleteHead_looplinkList(looplinkList* head);

datatype deleteTail_looplinkList(looplinkList* head);

#endif

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

//创建一个带头结点的空的单链表
looplinkList* create_looplinkList()
{
    looplinkList* head=(looplinkList*)malloc(sizeof(looplinkList));
    if(NULL == head)
    {
        printf("头结点申请失败,创建单链表失败\n");
        return NULL;
    }
    head->text.len=0;    //初始化头结点中链表长度为0
    head->next=head;     //初始化头结点中的指针域为自己
    return head;
}
//判断链表是否为空
int isEmpty_looplinkList(looplinkList* head)
{
    return head->next == head?1:0;
}
//头插法插入数据
int insertHead_looplinkList(looplinkList* head,datatype num)
{
        //创建一个新的结点
        looplinkList* temp=(looplinkList*)malloc(sizeof(looplinkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");
            return -1;    
        }
        temp->text.data = num;
        temp->next = NULL;
        
        //头插法插入数据
        temp->next=head->next;        
        head->next=temp;
        head->text.len++;
        return 0;
}
//尾插法插入数据
int insertTail_looplinkList(looplinkList* head,datatype num)
{
        //创建一个新的结点
        looplinkList* temp=(looplinkList*)malloc(sizeof(looplinkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");
            return -1;    
        }
        temp->text.data = num;
        temp->next = NULL;
        
        //尾插法插入数据
        looplinkList* p=head;
        //判断是否是尾结点
        while(p->next!=head)
        {
            p=p->next;
        }
            temp->next=head;        
            p->next=temp;

        head->text.len++;
        return 0;
}

//遍历
void show_looplinkList(looplinkList* head)
{
    looplinkList* p=head;
    while(p->next!=head)
    {
        p=p->next;
        printf("%d ",p->text.data);
    }
    printf("\n");

}

//头结点删除
datatype deleteHead_looplinkList(looplinkList* head)
{
    if(isEmpty_looplinkList(head)==1)    
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }
    //头删法删除
    looplinkList* temp=head->next;
    head->next=temp->next;
    //存要删除的数据
    datatype num=temp->text.data;
    free(temp);

    //更新头结点中记录的链表长度
    head->text.len--;
    return num;
}

//尾结点删除
datatype deleteTail_looplinkList(looplinkList* head)
{
    if(isEmpty_looplinkList(head)==1)    
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }
    //尾删法删除
    looplinkList* temp=head;
    while(temp->next->next!=head)
    {
        temp=temp->next;
    }
    //存要删除的数据
    datatype num=temp->next->text.data;
    free(temp->next);
    temp->next=head;
    //更新头结点中记录的链表长度
    head->text.len--;
    return num;
}

    


双链表

#include <stdio.h>
#include <stdlib.h>
#include "./fun.h"
int main(int argc, const char *argv[])
{
    doublelinkList* head=create_doublelinkList();
    insertHead_doublelinkList(head,30);
    insertHead_doublelinkList(head,34);
    insertHead_doublelinkList(head,78);
    insertHead_doublelinkList(head,99);
    show_doublelinkList(head);
    printf("-----------------------------\n");
    insertTail_doublelinkList(head,55);
    insertTail_doublelinkList(head,27);
    insertTail_doublelinkList(head,44);
    insertTail_doublelinkList(head,9);
    show_doublelinkList(head);
    printf("-----------------------------\n");
    datatype n=deleteHead_doublelinkList(head);
    printf("头删删除的是%d\n",n);
    show_doublelinkList(head);

    printf("-----------------------------\n");
    datatype num=deleteTail_doublelinkList(head);
    printf("尾删删除的是%d\n",num);
    show_doublelinkList(head);
    printf("-----------------------------\n");
    insertByPos_doublelinkList(head,2,2);
    show_doublelinkList(head);
    insertByPos_doublelinkList(head,6,89);
    show_doublelinkList(head);
    printf("-----------------------------\n");
    datatype m=deleteByPos_doublelinkList(head,2);
    printf("删除的是%d\n",m);
    show_doublelinkList(head);
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include "./fun.h"
//创建一个空的双向链表
doublelinkList* 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;
}
int isEmpty_doublelinkList(doublelinkList* head)
{
    return head->next == NULL?1:0;
}
//头插法插入数据
void insertHead_doublelinkList(doublelinkList* head,datatype num)
{
        //创建一个新的结点
        doublelinkList* temp=(doublelinkList*)malloc(sizeof(doublelinkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");    
        }
        temp->text.data = num;
        temp->next = NULL;
        temp->prev = NULL;
        
        //链表为空和链表中有数据的时候,头插的逻辑不一致
        if(isEmpty_doublelinkList(head)==1)
        {
            temp->next=head->next;
            head->next=temp;

            temp->prev=head;
        }
        else
        {
            temp->next=head->next;
            head->next=temp;
            temp->next->prev=temp;
            temp->prev=head;
        }
        //更新头结点中记录的链表长度
        head->text.len++;
        return;
}
//尾插
void insertTail_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;
    //上述循环结束后,p存储的是最后一个节点的地址
    
    temp->next=p->next;
    p->next=temp;
    temp->prev=p;
    return;

}

//遍历
void show_doublelinkList(doublelinkList* head)
{
    doublelinkList* p=head;
    while(p->next!=NULL)
    {
        p=p->next;
        printf("%d ",p->text.data);
    }
    printf("\n");

}

//按位置插入
void insertByPos_doublelinkList(doublelinkList* head,datatype num,int pos)
{
    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("pos=%d 插入位置非法,插入失败\n",pos);
        return;
    }

    //找到要插入位置的前一个节点位置
    doublelinkList* p=head;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }

    if(p->next!=NULL)
    {
        temp->next=p->next;
        p->next=temp;

        temp->next->prev=temp;
        temp->prev=p;
    }
    else
    {
        temp->next=p->next;
        p->next=temp;

        temp->prev=p;
    }
    head->text.len++;
    return;
}

//尾删
datatype deleteTail_doublelinkList(doublelinkList* head)
{
    doublelinkList* p=head;
    while(p->next!=NULL)
    {
        p=p->next;
    }
    datatype num=p->text.data;
    p->prev->next=NULL;
    free(p);
    return num;
}

//头删
datatype deleteHead_doublelinkList(doublelinkList* head)
{
    datatype num;
    if(isEmpty_doublelinkList(head)==1)
    {
        printf("无法删除\n");
    }
    doublelinkList* p=head->next;
    if(p->next!=NULL)
    {
        num=p->text.data;
        head->next=p->next;
        p->next->prev=head;
        free(p);
    }
    else
    {
        num=p->text.data;
        head->next=NULL;
        free(p);
    }
    return num;
}

//按位置删除
datatype deleteByPos_doublelinkList(doublelinkList* head,datatype pos)
{
    datatype num;
    doublelinkList* p=head;
    for(int i=0;i<pos;i++)
    {
        p=p->next;
    }
    if(p->next!=NULL)
    {
        num=p->text.data;
        p->prev->next=p->next;
        p->next->prev=p->prev;
        free(p);
    }
    else
    {
        num=p->text.data;
        p->prev->next=p->next;
        free(p);
    }
     return num;
}

#ifndef __FUN_H__
#define __FUN_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(doublelinkList* head,datatype num);
void show_doublelinkList(doublelinkList* head);
void insertByPos_doublelinkList(doublelinkList* head,datatype num,int pos);
void insertTail_doublelinkList(doublelinkList* head,datatype num);

datatype deleteHead_doublelinkList(doublelinkList* head);
datatype deleteTail_doublelinkList(doublelinkList* head);
datatype deleteByPos_doublelinkList(doublelinkList* head,datatype pos);


#endif

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值