#include<stdio.h>
#include<stdlib.h>
struct node //前插
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void create_link(Link * head)
{
*head = NULL;
}
void create_node(Link * new_node)
{
*new_node = (Link)malloc(sizeof(Node));
}
void insert_node_tail(Link * head,Link new_node)
{
Link p;
p = *head;
if(NULL==*head)
{
*head=new_node;
new_node->next=NULL;
}
else
{
while(p->next !=NULL)
{
p=p->next;
}
p->next=new_node;
new_node->next=NULL;
}
}
void insert_node_mid_front(Link * head,Link new_node,int loc)
{
Link p;
Link q;
p=NULL;//总是被忽略
q=NULL;
q = *head;
p = *head;//若p=(*head)->next,那么少头结点的判断
if(NULL==*head)//p
{
*head = new_node;
new_node->next = NULL;
}
else
{
while(p !=NULL && p->num != loc)//->next特别重要
{
q=p;
// q->next=p;//严重错误不是指向,是位置改变
p = p->next;//一定要理解这个写法
}
if(p == *head)
{
new_node->next = p;
*head=new_node;
}
else
{
new_node->next=p;
q->next = new_node;
}
}
}
void display_link(Link head)
{
Link p=NULL;
p = head;
if(NULL==p)
{
printf("Link is Empty!\n");
return; //这句不能少!!!流程返回,值不返回。
}
while(p != NULL)
{
printf("%5d",p->num);//与printf("%5d\n",p->num);不同
p = p->next;
}
printf("\n");
}
void release_link(Link * head)
{
Link p=NULL; //先赋值啊!!!
p=*head;
while(*head!=NULL) //这里不能写p,p被释放
{
p=*head;
*head=(*head)->next;
free(p);
}
}
int main()
{
Link head=NULL;
Link new_node=NULL;
int i,loc;
create_link(&head);
for(i=0;i<10;i++)
{
create_node(&new_node);
new_node->num=i+1;
insert_node_tail(&head,new_node);
}
create_node(&new_node);//
display_link(head);
printf("Input loc:");
scanf("%d",&loc);
printf("Input new_node->num:");
scanf("%d",&new_node->num);//搞忘了,num是int型
insert_node_mid_front(&head,new_node,loc);//整理与上面new的关系
create_node(&new_node);//
display_link(head);
release_link(&head);
create_node(&new_node);//
display_link(head);
return 0; //这句不能少!!!
}
输出结果:
judy@judy-virtual-machine:~/桌面/ft$ ./yx4
1 2 3 4 5 6 7 8 9 10
Input loc:7
Input new_node->num:4
1 2 3 4 5 6 4 7 8 9 10
Link is Empty!