2022/2/17

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define FAIL -1
struct hnode
{
    int num;
    struct hnode *next;
};
typedef struct hnode Hnode;
typedef Hnode *Hlink;

void create_new_node(Hlink *new_node)//创建结点
{
    *new_node=(Hlink)malloc(sizeof(Hnode));
}
void create_hlink(Hlink *head) //创建链表
{
    create_new_node(head);
    (*head)->next=NULL;
}
void insert_node_head(Hlink head,Hlink new_node)//头插
{
    new_node->next=head->next;
    head->next=new_node;
}
void insert_node_tail(Hlink head,Hlink new_node)//尾插
{
    Hlink p=NULL;
    p=head;
    while (p->next!=NULL)
    {
        p=p->next;
    }
    p->next=new_node;
    new_node->next=NULL;
}
void display_Hlink(Hlink head)//遍历链表
{
    Hlink p=NULL;
    if (head==NULL)
    {
        printf("链表不存在!\n");
        return;
    }
    else if (head->next==NULL)
    {
        printf("链表为空\n");
        return;
    }
    p=head->next;
    while (p!=NULL)
    {
        printf("%d\n",p->num);
        p=p->next;
    }
    
}
void insert_Hlink_mid_after(Hlink head,Hlink new_node,int loc)//中间插入,插入位置在后面
{
    Hlink p=NULL;
    p=head->next;
    while (p!=NULL&&p->num!=loc)
    {
        p=p->next;
    }
    new_node->next=p->next;   
    p->next=new_node;

}
void insert_Hlink_mid_front(Hlink head,Hlink new_node,int loc)//中间插入,插入位置在前
{
    Hlink p=NULL,q=NULL;
    q=head;
    p=head->next;
    while (p!=NULL&&p->num!=loc)
    {
        q=p;
        p=p->next;
    }
    q->next=new_node;
    new_node->next=p;

}
void insert_Hlink_sort(Hlink head,Hlink new_node)//排序插入
{
    Hlink q=NULL,p=NULL;
    q=p=head;
    while (p!=NULL&&p->num<new_node->num)
    {
        q=p;
        p=p->next;
    }
    q->next=new_node;
    new_node->next=p;
    
}
void delete_headlink(Hlink head,int num2)//删除结点
{
    Hlink q=NULL,p=NULL;
    q=head;
    p=head->next;
    while (p!=NULL&&p->num!=num2)
    {
        q=p;
        p=p->next;
    }
    if (p==NULL)
    {
        printf("没有该结点!\n");
    }
    else 
    {
        q->next=p->next;
        free(p);
    }  
}
void reserv_headlink(Hlink head)//倒序
{
    Hlink p1=NULL,p2=NULL,p3=NULL;
    if(head->next==NULL||head->next->next==NULL)
    return;
    p1=head->next;
    p2=p1->next;
    p3=p2->next;
    p1->next=NULL;
    while (p3!=NULL)
    {
        p2->next=p1;
        p1=p2;
        p2=p3;
        p3=p3->next;
    }
    p2->next=p1;
    head->next=p2;

}
int  headlink_length(Hlink head) //求链表长度
{
    Hlink p;
    int i=0;
    p=head;
    if (head->next==NULL)
    {
        printf("链表是空");
    }
    else
    {
        while (p->next!=NULL)
        {
            p=p->next;
            i++;
        }
        
    }
    return i;
}
int find_link(Hlink head,int num3)//查找
{
    Hlink p=NULL;
    p=head->next;
    if (p==NULL)
    {
        printf("链表是空\n");
        return FAIL;
    }
    while (p->num!=num3)
    {
        p=p->next;
        if (p==NULL)
        {
            return FAIL;
        }
        
    }
    return p->num;
    
}

int change_link(Hlink head,int num4,Hlink new_node)//替换
{
    Hlink p=NULL;
    p=head->next;
    if (p==NULL)
    {
        printf("链表是空\n");
        return FAIL;
    }
    while (p->num!=num4)
    {
        p=p->next;
        if (p==NULL)
        {
            printf("该链表没有此值!\n");
            return FAIL;
        }
        
    }
    p->num=new_node->num;
    
}

/*void link_sort(Hlink head)
{
    Hlink p1=NULL,p2=NULL;
    if (head->next==NULL||head->next->next==NULL)
    {
        return;
    }
    p1=head->next;
    p2=p1->next;
    while (p2!=NULL)
    {
        Hlink t1=head->next;
        Hlink t2=t1->next;
        while (t1!=p2&&t1->num>p2->num)
        {
            t1=t1->next;
            t2=t2->next;
        }
        if (t1==p1)
        {
            p1=p2;
        }
        else
        {
            p1->next=p2->next;
            p2->next=t1;

        }
        p2=p1->next;
        
    }
    printf("排序成功\n");
    
    
}
*/

void clear_Hlink(Hlink head)//清空除了表头结点的所有
{
    Hlink p=NULL;
    p=head->next;
    while (p!=NULL)
    {
        head->next=p->next;
        free(p);
        p=head->next;
    }
    
}
void destroy_Hlink(Hlink *head)//释放链表
{
    clear_Hlink(*head);
    free(*head);
    *head=NULL;
    
}
int main()
{
    Hlink head=NULL;
    Hlink   new_node=NULL;

    int i,loc,num,num2,num3,num4;
    srand((unsigned)time(NULL));
    create_hlink(&head);
    for ( i = 0; i < 10; i++)
    {
        create_new_node(&new_node);
        new_node->num=rand()%100;
        //new_node->num=1+i;
        //insert_node_head(head,new_node);
        //insert_node_tail(head,new_node);
        //insert_Hlink_sort(head,new_node);
    }
    display_Hlink(head);
    /*中间插入
    create_new_node(&new_node);
    printf("输入你要插入的位置\n");
    scanf("%d",&loc);
    printf("输入你要插入的数\n");
    scanf("%d",&new_node->num);
    insert_Hlink_mid_after(head,new_node,loc);
    display_Hlink(head);
    */
    /*
    printf("输入你想删除的数\n");
    scanf("%d",&num2);
    delete_headlink(head,num2);
    display_Hlink(head);

    /*显示链表的长度
    printf("带头结点的链表的长度%d\n",headlink_length(head));
    */

    /*转值链表
    reserv_headlink(head);
    printf("转后\n");
    display_Hlink(head);
    */
    
    /*查找某个数
    printf("输入一个要查找的数字\n");
    scanf("%d",&num3);
    printf("查找的结果为%d(结果为-1时为错误输入,即链表中不存在该数)\n",find_link(head,num3));*/
    
    /*替换链表中的某个值
    create_new_node(&new_node);
    printf("请你输入要替换的值!\n");
    scanf("%d",&num4);
    printf("请你输入你想替换成的值!\n");
    scanf("%d",&new_node->num);
    change_link(head,num4,new_node);
    display_Hlink(head);
    */
    clear_Hlink(head);
    display_Hlink(head);
    destroy_Hlink(&head);
    display_Hlink(head);
        
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值