#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MALLOC_OK 1
#define MALLOC_NO 0
#define CREATE_OK 1
#define CREATE_NO 0
/*
* 带头结点的单链表
*
* */
struct node
{
int num;
char name;
int age;
struct node *next;
};
typedef struct node Hnode;
typedef Hnode * Hlink;
//判断内存是否分配成功
int is_mallo_ok(Hlink new_node)
{
if(new_node == NULL)
{
return MALLOC_NO;
}
return MALLOC_OK;
}
//创建新节点
int create_new_node(Hlink *new_node)
{
*new_node = (Hlink)malloc(sizeof(Hnode));
//判断内存是否为空
if(MALLOC_OK == is_malloc_ok(*new_node))
{
return CREATE_OK;
}
return CREATE_NO;
}
//创建链表
int create_Hlink(Hlink *head)
{
if(CREATE_OK == create_new_node(head))
{
(*head) -> next = NULL;
return CREATE_OK;
}
return CREATE_NO;
}
//插入链表-头插法
void insert_node_head(Hlink head,Hlink new_node)
{
new_node -> next = head -> next;
head -> next = new_node;
}
//中间插入法
void insert_node_mid(Hlink head,Hlink new_node,int loc,int num) //这里的num可以放在主函数直接输入
{
Hlink p = NULL;
int count = 1; //计数
p = head -> next;
if(p == NULL)
{
head -> next = new_node;
new_node ->next = NULL;
}
else
{
while(p != NULL && count != loc)
{
p = p ->next;
count++;
}
if(p != NULL)
{
new_node ->num = num;
new_node ->next = p ->next;
p ->next = new_node;
}
else
{
printf("error local to insert!");
}
}
}
//尾插法
void insert_node_tail(Hlink head, Hlink new_node)
{
Hlink p = NULL;
P = head;
while(p ->next != NULL)
{
p = p ->next;
}
p ->next = new_node;
new_node ->next = NULL;
}
//列出链表
void display_Hlink(Hlink head)
{
Hlink p = NULL;
if(head == NULL)
{
printf("no this link\n");
}
else if(head ->next == NULL)
{
printf("link is null\n");
}
else
{
p = head ->next;
while(P != NULL)
{
printf("%d\n",p ->num);
p = p ->next;
}
}
}
//释放空间-头节点留着
void clear_Hlink(Hlink head)
{
Hlink p = NULL;
p = head ->next;
while(p != NULL)
{
head ->next = p ->next;
free(p);
p = head ->next;
}
}
//全部释放
void release_Hlink(Hlink *head)
{
clear_Hlink(*head);
free(*head);
*head = NULL;
printf("空间全部释放!\n");
}
//查找节点
void seek_node(Hlink head,int n)
{
Hlink p = NULL;
int count = 1;
p = head ->next;
while(p != NULL && count != n)
{
p = p ->next;
count++;
}
if(p != NULL)
{
printf("no this node!\n");
}
}
//删除节点
void delete_node(Hlink head, int delete_node_loc)
{
Hlink p = NULL;
Hlink q = NULL;
q = head;
p = head;
int count = 0;
int sum = 0;
while(p != NULL)
{
p = p ->next;
sum++;
}
p = head;
if(p == NULL)
{
printf("Link is empty");
}
else if(delete_node_loc > sum)
{
printf("no this node!");
}
else
{
p = head;
while(p != NULL && count != delete_node_loc)
{
q = p;
p = p ->next;
count++;
}
if(p != NULL)
{
q ->next = p ->next;
free(p);
}
else
{
printf("no this node!");
}
}
}
带头结点的单链表实现
最新推荐文章于 2023-05-04 11:33:30 发布