函数构架
代表头的意思:在链表中安置一个表头,确定头结点的位置,这样就不需要通过对头地址的改变来对链表进行操作,只需要对头结点的下一个地址操作,因为头结点是确定的所以每次操作不需要修改链表的头地址。
- 创建结点元素
- 创建带有表头的空链表
- 创建结点
- 对于结点的操作(增、删、改、查)
- 编译链表
链表的创建,结点组成元素的创建
struct node //结构体
{
int num;
struct node *next;
};
typedef struct node Node;
typedef Node * Link;
函数体的创建
头插
**头插法**
void create_new_node(Link * new_node)
{
*new_node = (Link)malloc(sizeof(Node));
is_malloc_ok(*new_node);
}
头结点函数的创建
void create_list(Link *head)
{
create_new_node(head);
(*head)->next = NULL;
}
中间结点插入(前、后)
void insert_node_head(Link head,Link new_node)
{
Link p = NULL;
Link q = NULL;
q = head;
p = q->next;
while(NULL != p && (p->num) < new_node->num )
{
q = p;
p = p->next;
}
new_node->next = p;
q->next = new_node;
}
void insert_node_mid(Link head,Link new_node,int loc)
{
Link p = NULL;
Link q = NULL;
q = head;
p = q->next;
while(NULL != p && p->num != loc)
{
q = p;
p = p->next;
}
new_node->next = p;
q->next = new_node;
}
删除结点
void delect_node(Link head,int loc)
{
Link p;
Link q;
q = head;
p = q->next;
while(NULL != p && p->num != loc)
{
q = p;
p = p->next;
}
q->next = p->next;
free(p);
}
查找结点
Link search_node(Link head,int loc)
{
Link p;
p = head->next;
while(NULL != p && p->num != loc)
{
p = p->next;
}
return p;
}
清空链表(不包括头结点)
void clear_list(Link head)
{
Link p;
p = head->next;
while(NULL != p)
{
head->next = p->next;
free(p);
p = head->next;
}
}
清空链表(包括头结点)
void clear_all_list(Link head)
{
Link p = NULL;
p = head->next;
while(NULL != p)
{
head->next = p->next;
free(p);
p = head->next;
}
head = NULL;
}
打印链表
void display(Link head)
{
Link p;
p = head->next;
if(NULL != p)
{
while(NULL != p)
{
printf("%d\n",p->num);
p = p->next;
}
}
else
{
printf("is free\n");
}
}
主函数
int main()
{
int i;
Link head;
Link new_node;
int loc = 0;
Link search = NULL;
create_list(&head);
srand(time(NULL));
for(i=0; i < 10; i++)
{
create_new_node(&new_node);
new_node->num = rand() % 100;
insert_node_head(head,new_node);
}
display(head);
/* create_new_node(&new_node); //插入结点
new_node->num = 100;
printf("输入插入的的行数字:");
scanf("%d",&loc);
insert_node_mid(head,new_node,loc);
display(head); */
/* printf("请输入删除的行的数字:");
scanf("%d",&loc);
delect_node(head,loc);
display(head); */
/* printf("查找行的数字:"); //查找结点
scanf("%d",&loc);
search = search_node(head,loc);
printf("%d\n",search->num);*/
clear_list(head); //带表头节点的释放,表头不释放
clear_all_list(head); //全部释放 表头也释放
display(head);
return 0;
}