单链表(头节点)

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
int item;
struct node *next;
}node;

node sentry = {0, NULL}; //头节点(哨兵)
node *head = &sentry;

node *mk_node(int item)
{
node *p = (node *)malloc(sizeof(node));

if (p == NULL)
{
    printf("malloc failed!\n");
    exit(1);
}

p->item = item;
p->next = NULL;

return p;

}

void free_node(node *p)
{
free§;
}

void insert_node(node *p)
{
p->next = head->next;
head->next = p;
}

void insert_node_l2b(node *p)
{
node *pre = head;

while (pre->next != NULL)
{
    if (pre->next->item > p->item)
    {
        break;
    }
    pre = pre->next;
}
p->next = pre->next;
pre->next = p;

}

void print_node(node *p)
{
printf("%d ", p->item);
}

void traverse()
{
node *p = head->next;

while (p != NULL)
{
    print_node(p);
    p = p->next;
}
printf("\n");

}

node *search_node(int target)
{
node *p = head->next;

while (p != NULL)
{
    if (p->item == target)
    {
        return p;
    }
    p = p->next;
}
return NULL;

}

void rm_node(node *p)
{
node *pre = head;

while (pre->next != NULL)
{
    if (pre->next == p)
    {
        pre->next = p->next;
        p->next = NULL;
        return;
    }
    pre = pre->next;
}

}

void destory()
{
node *p;

while (head->next != NULL)
{
    p = head->next;
    head = head->next;
    p->next = NULL;
    free_node(p);
}

}

void rev_node()
{
node *o_head = head->next;
node *p;

head->next = NULL;

while (o_head != NULL)
{
    p = o_head;
    o_head = o_head->next;
    p->next = NULL;

    insert_node(p);
}

}

void insert_sort()
{
node *o_head = head->next;
node *p;

head->next = NULL;

while (o_head != NULL)
{
    p = o_head;
    o_head = o_head->next;
    p->next = NULL;

    insert_node_l2b(p);
    traverse();
}

}

int main()
{
int target;

node *p = mk_node(1);
insert_node(p);
p = mk_node(-12);
insert_node(p);
p = mk_node(-30);
insert_node(p);
p = mk_node(44);
insert_node(p);
p = mk_node(5);
insert_node(p);
p = mk_node(16);
insert_node(p);
p = mk_node(127);
insert_node(p);
p = mk_node(81);
insert_node(p);
p = mk_node(-9);
insert_node(p);
traverse();

insert_sort();
traverse();

printf("please input target:");
scanf("%d", &target);
p = search_node(target);
if (p == NULL)
{
    printf("Can't find item %d\n", target);
}else
{
    printf("%p %d %d\n", p, p->item, target);

    rm_node(p);
    traverse();

    rev_node();
    traverse();

    destory();
    traverse();
}


return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值