这两天学链表,写了个小程序加了点注释,不知道是不是都对,如有不对欢敬请正!

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

struct node //声明结构体类型struce node node是名字
{
int num;
struct node * next; //next是指针变量,指向结构体变量
};

typedef struct node Node; //更换上述结构体名字为Node
typedef struct node * Link; //将str node *更换名字为Link

void is_malloc_ok(Link new_node) //判断malloc是否执行
{
if(new_node == NULL)
{
printf(“malloc error\n”);
exit(-1);
}
}
void create_node(Link * new_node) //建立节点
{
*new_node = (Link) malloc(sizeof(Node)); //分配地址
is_malloc_ok(*new_node); //检查malloc是否执行
}

void create_link(Link * head) //创建链表,*head是二级指针
{ //即指针的指针,表示指针的地址,也就是&head
*head = NULL; //这个链表暂时为空
}
void insert_node_head(Link * head,Link new_node) //插入节点头插
{
new_node->next = *head;
*head = new_node;
}

void display_link(Link head) //输出节点
{
Link p;
p = head;

if(head == NULL)           
{ 
    printf("link is empty\n");  //如果头节点为NULL,即头节点就是最后
    return;      //一个节点了,那么整个链表就空了
}
while(p != NULL)
{
    printf("%d\n",p->num);        //输出p指向结点的数据
    p = p->next;                  //p指向下一个结点
}

}

void insert_node_tail(Link * head,Link new_node) //插入节点尾插
{
Link p;
p = *head; //p指向头节点
if(*head == NULL) //表示若头节点里啥都没有
{
*head = new_node; //就把新节点赋给头节点
new_node->next = NULL; //再在下一个节点(即最后一个节点)赋成NULL
}
else //如果头节点不为空,有东西
{
while(p->next != NULL) //p的下一个不是最后一个节点
{
p = p->next; //使p指向下一个节点,直到p是尾节点的前一个节点
}
p->next = new_node; //把新节点给尾节点
new_node->next = NULL; //在尾节点后面再加一个NULL
}
}

void release_link(Link *head) //释放链表
{
Link p;
p = *head;
while(*head != NULL) //头节点不为空,即头节点不为最后一个节点时
{
*head = (*head)->next; //头节点指向下一个节点
free§; //同时释放p,p就是头节点当前所在位置
p = *head;
}
}
void insert_node_mid(Link *head,Link new_node,int loc)
{
Link p,q;
p = q = *head;
if((*head)->num == loc)
{
new_node->next = *head;
*head = new_node;
}
else
{
while(p != NULL && p->num != loc)
{
q = p;
p = p->next;
}
if(p == NULL)
{
q->next = new_node;
new_node->next = NULL;
}
else
{
q->next = new_node;
new_node->next = p;
}
}
}
int main()
{
Link head = NULL; //防止野指针
Link new_node = NULL; //
int i;
int loc;

create_link(&head);    //head是头指针,&head是头指针的地址
//尾插
for(i = 0;i < 10;i++)
{
    //new_node = (Link)malloc(sizeof(Node));
    create_node(&new_node);
    new_node->num = i + 1; //给每个num赋一个值
    //insert_node_head(&head,new_node);
    insert_node_tail(&head,new_node);
}
display_link(head);

create_node(&new_node); //要插入节点,首先要再建一个节点
printf("input a number for new_node:\n");  //输入新节点的值
scanf("%d",&new_node->num);
printf("input a number for insert place:\n");//输入新节点要插的位置
scanf("%d",&loc);

insert_node_mid(&head,new_node,loc);
display_link(head);
release_link(&head);    //释放
display_link(head);     //再次输出,若释放完就为空

return 0;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值