#include <stdio.h>
#include <stdlib.h>
/*
*带头结点的单链表
*
* */
struct node
{
int num;
char name;
int age;
struct node *next;
};
typedef struct node Hnode;
typedef Hnode * Hlink;
//创建新节点
void create_new_node(Hlink *new_node)
{
*new_node = (Hlink)malloc(sizeof(Hnode));
}
//创建链表
void create_Hlink(Hlink *head)
{
create_new_node(head);
(*head)->next = NULL;
}
//插入链表-头插法
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)
{
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("第 %d 位的结点值是:%d\n ", n , p->num);
}
else
{
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!");
}
}
}
int main(int argc, char **argv)
{
//创建结点模型,定义结构体和结构体指针
Hlink head = NULL; //定义头指针
Hlink new_node = NULL; //定义一个指针用于指向结点
int i;
int loc; //中间插入位置
int num; //中间插入的值
int n; //查找第几个结点
int delete_node_loc; //删除第几个结点
//创建链表
create_Hlink(&head);
//插入链表
printf("插入结点\n");
for(i = 0; i < 10; i++)
{
create_new_node(&new_node);
new_node->num = i + 1;
// insert_node_head(head, new_node); //头插函数
insert_node_tail(head, new_node); //尾插函数
}
/* //中间插入
printf("请输入要插入的位置:\n");
scanf("%d",&loc);
printf("请输入要插入的数:\n");
scanf("%d",&num);
create_new_node(&new_node);
insert_node_mid(head, new_node, loc, num); //中间插入函数
*/
//输出链表
display_Hlink(head);
/*//查找结点
printf("请输入需要查找第几个结点:\n");
scanf("%d",&n);
seek_node(head, n);
*/
//删除结点
printf("请输入要删除第几个结点:\n");
scanf("%d",&delete_node_loc);
delete_node(head, delete_node_loc);
display_Hlink(head);
//释放空间
clear_Hlink(head); //清除除头结点外所有结点
display_Hlink(head);
release_Hlink(&head); //释放所有结点(包括头结点)
display_Hlink(head);
return 0;
}
带头结点的链表的增、删、查、插
最新推荐文章于 2023-08-05 15:57:39 发布