#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct node //结构体定义值域和指针域
{
int num;
struct node * next;
};
typedef struct node Node;
typedef struct node * Link;
void is_malloc_ok(Link new_node) //判断分配空间是否成功
{
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); //这里含有上面的封装代码
}
void create_link(Link *head)
{
create_node(head);
(*head)->next = NULL;
}
void insert_node_head(Link * head,Link new_node)
{
new_node->next = (*head)->next;
(*head)->next = new_node;
}
void insert_node_tail(Link * head,Link new_node)
{
Link p;
p = *head;
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
new_node->next = NULL;
}
void insert_node_mid_head(Link * head,Link new_node,int loc)//参数变量包含从哪个链表插入,插入的节点
{ //的值域是多少,loc是与新插入的节点的值域相比较
Link q,p;
q = *head;
p = (*head)->next;
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;
}
}
void insert_node_mid_tail(Link * head,Link new_node,int loc)
{
Link q,p;
q = *head;
p = (*head)->next;
while(p != NULL && q->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;
}
}
void insert_node_sort_soc(Link * head,Link new_node)
{
Link q,p;
q = *head;
p = (*head)->next;
while(p != NULL && p->num > new_node->num)
{
q = p;
p = p->next;
}
q->next = new_node;
new_node->next = p;
}
void delete_node(Link head,int loc)
{
Link q,p;
q = head;
p = head->next;
while(p != NULL && p->num != loc)
{
q = p;
p = p->next;
}
if(p == NULL)
{
printf("no such node!\n");
return;
}
else
{
q->next = p->next;
free(p);
}
}
void display_link(Link head)
{
Link p;
p = head->next;
if(head->next == NULL)
{
printf("link is empty!\n");
return;
}
while(p != NULL)
{
printf("num = %d\n",p->num);
p = p->next;
}
}
void release_link(Link *head)
{
Link p;
p = (*head)->next;
while(p != NULL)
{
(*head)->next = p->next;
free(p);
p = p->next;
}
}
int main()
{
int i;
int loc = 0; //定义为与某个节点的数相比较
Link head = NULL;
Link new_node = NULL;
srand((unsigned)time(NULL));
create_link(&head); //创建带表头的空链表
for(i = 0;i < 10;i++)
{
create_node(&new_node);
new_node->num = rand() % 100; //给结点的值域随机赋值,定义为srand代码行
// insert_node_head(&head,new_node); //头插
// insert_node_tail(&head,new_node);//尾插
insert_node_sort_soc(&head,new_node);//排序插入(这里只展示了从大到小的排序)
}
display_link(head);
/* printf("please input the num to insert!\n"); //在某个节点前插入新节点
scanf("%d",&loc);
create_node(&new_node);
new_node->num = 100;
// insert_node_mid_head(&head,new_node,loc);
insert_node_mid_tail(&head,new_node,loc);
display_link(head);
printf("please input the num to delete!\n"); //阿紫某个节点后插入新节点
scanf("%d",&loc);
delete_node(head,loc);
display_link(head);
*/
release_link(&head); //释放空间
display_link(head);//显示
return 0;
}
带表头结点的单链表 的插入 删除 排序
最新推荐文章于 2023-08-05 15:57:39 发布