Day5 数据结构

Day5 数据结构_第1张图片

Lin.h

#ifndef __LIN_H__
#define __LIN_H__
#include
#include
typedef int DateType;
typedef struct node
{
    union
    {
        int len;
        DateType date;
    };
    struct node *next;
}Lin,*LinPtr;

LinPtr create();//创建链表 == 创建头结点
int empty();//判空

//申请节点,封装数据
LinPtr Create_node(DateType e);
//头插
void Head_add(LinPtr A,DateType e);
//遍历
void Show(LinPtr A);
//尾差 
void End_add(LinPtr A,DateType e);
//任意位置插入
void Arb_insert(LinPtr A,int num,DateType e);
//头删
void First_delete(LinPtr A);
//尾删
void End_delete(LinPtr A);
//任意位置删除
void Arb_delete(LinPtr A,int num);
//按位置修改
void Arb_revise(LinPtr A,int num,DateType e);
//按值查找返回地址
void Back(LinPtr A,int num);
//反转
void Reverse(LinPtr A);

#endif
 

Lin.c

#include"Lin.h"

LinPtr create()
{
    LinPtr A = (LinPtr)malloc(sizeof(Lin));
    if(NULL == A)
    {
        printf("创建失败!\n");
        return NULL;
    }
    A->next = NULL;
    A->len = 0;
    printf("创建成功!\n");
    return A;
}
int empty(LinPtr A)//判空
{
    if(NULL == A)
    {
        printf("创建失败!\n");
        return -1;
    }
    return A->len == 0;
//  return A->next == NULL;
}

//申请节点,封装数据
LinPtr Create_node(DateType e)
{
    LinPtr p = (LinPtr)malloc(sizeof(Lin));
    if(NULL == p)
    {
        printf("申请失败!\n");
        return NULL;
    }
    p->date = e;
    p->next = NULL;
    return p;
}

//头插
void Head_add(LinPtr A,DateType e)
{
    if(NULL == A)
    {
        printf("插入失败!\n");
    }
    LinPtr p = Create_node(e);
    p->next = A->next;
    A->next = p;
    A->len++;
}
//尾差 
void End_add(LinPtr A,DateType e)
{
    if(NULL == A)
    {
        printf("插入失败!\n");
        return;
    }    
    LinPtr p = Create_node(e);
    LinPtr q = A;
    while(q->next != NULL)
    {
        q = q->next;
    }
    q->next = p;
    A->len++;
}

//遍历
void Show(LinPtr A)
{
    if(NULL == A||empty(A))
    {
        printf("遍历失败!\n");
        return;
    }
    LinPtr p = A;
    while(p->next != NULL )
    {
        p = p->next;
        printf("%d ",p->date);
    }
    putchar(10);
}

//任意位置插入
void Arb_insert(LinPtr A,int num,DateType e)
{
    if(NULL == A||num < 1||num > A->len)
    {
        printf("插入失败!\n");
        return;
    }
    LinPtr p = Create_node(e);
    LinPtr q = A;
    for(int i=1;i     {
        q = q->next;
    }
    p->next = q->next;
    q->next = p;
    A->len++;
}

//头删
void First_delete(LinPtr A)
{
    if(NULL == A||empty(A))
    {
        printf("删除失败!\n");
        return;
    }
    LinPtr p = A;
    p = p->next;
    A->next = p->next;
    A->len--;
    free(p);
    p == NULL;
}

//尾删
void End_delete(LinPtr A)
{
    if(NULL == A||empty(A))
    {
        printf("删除失败!\n");
        return;
    }
    LinPtr p = A;
    for(int i=0;ilen-1;i++)
    {
        p = p->next;
    }
    free(p->next);
    p->next = NULL;
    A->len--;    
}

//任意位置删除
void Arb_delete(LinPtr A,int num)
{
    if(NULL == A||empty(A))
    {
        printf("删除失败!\n");
        return;
    }
    LinPtr p = A;
    for(int i=0;i     {
        p = p->next;
    }
    LinPtr q = p;
    q = q->next;
    p->next = q->next;
    free(q);
    q = NULL;
    A->len--;
}

//按位置修改
void Arb_revise(LinPtr A,int num,DateType e)
{
    if(NULL == A||empty(A))
    {
        printf("修改失败!\n");
        return;
    }
    LinPtr p = A;
    for(int i=0;i     {
        p = p->next;
    }
    p->date = e;
}

//按值查找返回地址
void Back(LinPtr A,int num)
{
    if(NULL == A||empty(A))
    {
        printf("查找失败!\n");
        return;
    }
    LinPtr p = A;
    int n = 1;
    for(int i=0;ilen;i++)
    {
        p = p->next;
        if(num == p->date)
        {
            printf("第%d个位置\n",n);
            return;
        }
        n++;
    }
    printf("没有该值!\n");
}

//反转
void Reverse(LinPtr A)
{
    if(NULL == A||empty(A))
    {
        printf("反转失败!\n");
        return;
    }
    LinPtr o[A->len];
    o[0] = A;
    LinPtr p[A->len];
    p[0] = A;
    LinPtr q[A->len];
    q[0] = A;
    for(int j=0;jlen;j++)
    {
    
        p[j] = p[j]->next;
            for(int i=0;ilen-j;i++)
            {
                q[j] = q[j]->next;
            }
        o[j]->next = q[j];
        q[j]->next = p[j];
    
        p[j+1] = p[j];
        o[j+1] = o[j];
        q[j+1] = q[j];
    }


}

main.c

#include"Lin.h"
int main()
{
    LinPtr A = create();
    empty(A);//判空

    printf("头插\n");
    Head_add(A,10);
    Head_add(A,20);
    Head_add(A,30);
    Head_add(A,40);
    Head_add(A,50);
    Show(A);
    putchar(10);

    printf("尾插\n");
    End_add(A,10);
    End_add(A,20);
    End_add(A,30);
    End_add(A,40);
    End_add(A,50);
    End_add(A,60);
    Show(A);
    putchar(10);

    printf("任意位置插入\n");
    Arb_insert(A,1,60);
    Show(A);
    putchar(10);

    printf("头删\n");
    Head_add(A,1);
    Show(A);
    First_delete(A);
    Show(A);
    putchar(10);

    printf("尾删\n");
    End_add(A,1);
    Show(A);
    End_delete(A);
    Show(A);
    putchar(10);

    printf("任意位置删除\n");
    Arb_insert(A,5,66);
    Show(A);
    Arb_delete(A,5);
    Show(A);
    putchar(10);

    printf("按位置修改\n");
    Arb_revise(A,2,66);
    Show(A);
    Arb_revise(A,2,50);
    Show(A);
    putchar(10);

    printf("安值查找'10'的返回地址\n");
    Back(A,10);
    Show(A);
    putchar(10);

    printf("反转\n");
    Arb_insert(A,1,11);
    Arb_insert(A,2,22);
    Arb_insert(A,3,33);
    Show(A);
    Reverse(A);
    Show(A);
    putchar(10);
    
}

Day5 数据结构_第2张图片

你可能感兴趣的:(数据结构)