#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define FAIL -1
struct hnode
{
int num;
struct hnode *next;
};
typedef struct hnode 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_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("链表不存在!\n");
return;
}
else if (head->next==NULL)
{
printf("链表为空\n");
return;
}
p=head->next;
while (p!=NULL)
{
printf("%d\n",p->num);
p=p->next;
}
}
void insert_Hlink_mid_after(Hlink head,Hlink new_node,int loc)//中间插入,插入位置在后面
{
Hlink p=NULL;
p=head->next;
while (p!=NULL&&p->num!=loc)
{
p=p->next;
}
new_node->next=p->next;
p->next=new_node;
}
void insert_Hlink_mid_front(Hlink head,Hlink new_node,int loc)//中间插入,插入位置在前
{
Hlink p=NULL,q=NULL;
q=head;
p=head->next;
while (p!=NULL&&p->num!=loc)
{
q=p;
p=p->next;
}
q->next=new_node;
new_node->next=p;
}
void insert_Hlink_sort(Hlink head,Hlink new_node)//排序插入
{
Hlink q=NULL,p=NULL;
q=p=head;
while (p!=NULL&&p->num<new_node->num)
{
q=p;
p=p->next;
}
q->next=new_node;
new_node->next=p;
}
void delete_headlink(Hlink head,int num2)//删除结点
{
Hlink q=NULL,p=NULL;
q=head;
p=head->next;
while (p!=NULL&&p->num!=num2)
{
q=p;
p=p->next;
}
if (p==NULL)
{
printf("没有该结点!\n");
}
else
{
q->next=p->next;
free(p);
}
}
void reserv_headlink(Hlink head)//倒序
{
Hlink p1=NULL,p2=NULL,p3=NULL;
if(head->next==NULL||head->next->next==NULL)
return;
p1=head->next;
p2=p1->next;
p3=p2->next;
p1->next=NULL;
while (p3!=NULL)
{
p2->next=p1;
p1=p2;
p2=p3;
p3=p3->next;
}
p2->next=p1;
head->next=p2;
}
int headlink_length(Hlink head) //求链表长度
{
Hlink p;
int i=0;
p=head;
if (head->next==NULL)
{
printf("链表是空");
}
else
{
while (p->next!=NULL)
{
p=p->next;
i++;
}
}
return i;
}
int find_link(Hlink head,int num3)//查找
{
Hlink p=NULL;
p=head->next;
if (p==NULL)
{
printf("链表是空\n");
return FAIL;
}
while (p->num!=num3)
{
p=p->next;
if (p==NULL)
{
return FAIL;
}
}
return p->num;
}
int change_link(Hlink head,int num4,Hlink new_node)//替换
{
Hlink p=NULL;
p=head->next;
if (p==NULL)
{
printf("链表是空\n");
return FAIL;
}
while (p->num!=num4)
{
p=p->next;
if (p==NULL)
{
printf("该链表没有此值!\n");
return FAIL;
}
}
p->num=new_node->num;
}
/*void link_sort(Hlink head)
{
Hlink p1=NULL,p2=NULL;
if (head->next==NULL||head->next->next==NULL)
{
return;
}
p1=head->next;
p2=p1->next;
while (p2!=NULL)
{
Hlink t1=head->next;
Hlink t2=t1->next;
while (t1!=p2&&t1->num>p2->num)
{
t1=t1->next;
t2=t2->next;
}
if (t1==p1)
{
p1=p2;
}
else
{
p1->next=p2->next;
p2->next=t1;
}
p2=p1->next;
}
printf("排序成功\n");
}
*/
void clear_Hlink(Hlink head)//清空除了表头结点的所有
{
Hlink p=NULL;
p=head->next;
while (p!=NULL)
{
head->next=p->next;
free(p);
p=head->next;
}
}
void destroy_Hlink(Hlink *head)//释放链表
{
clear_Hlink(*head);
free(*head);
*head=NULL;
}
int main()
{
Hlink head=NULL;
Hlink new_node=NULL;
int i,loc,num,num2,num3,num4;
srand((unsigned)time(NULL));
create_hlink(&head);
for ( i = 0; i < 10; i++)
{
create_new_node(&new_node);
new_node->num=rand()%100;
//new_node->num=1+i;
//insert_node_head(head,new_node);
//insert_node_tail(head,new_node);
//insert_Hlink_sort(head,new_node);
}
display_Hlink(head);
/*中间插入
create_new_node(&new_node);
printf("输入你要插入的位置\n");
scanf("%d",&loc);
printf("输入你要插入的数\n");
scanf("%d",&new_node->num);
insert_Hlink_mid_after(head,new_node,loc);
display_Hlink(head);
*/
/*
printf("输入你想删除的数\n");
scanf("%d",&num2);
delete_headlink(head,num2);
display_Hlink(head);
/*显示链表的长度
printf("带头结点的链表的长度%d\n",headlink_length(head));
*/
/*转值链表
reserv_headlink(head);
printf("转后\n");
display_Hlink(head);
*/
/*查找某个数
printf("输入一个要查找的数字\n");
scanf("%d",&num3);
printf("查找的结果为%d(结果为-1时为错误输入,即链表中不存在该数)\n",find_link(head,num3));*/
/*替换链表中的某个值
create_new_node(&new_node);
printf("请你输入要替换的值!\n");
scanf("%d",&num4);
printf("请你输入你想替换成的值!\n");
scanf("%d",&new_node->num);
change_link(head,num4,new_node);
display_Hlink(head);
*/
clear_Hlink(head);
display_Hlink(head);
destroy_Hlink(&head);
display_Hlink(head);
}
2022/2/17
最新推荐文章于 2024-07-25 15:54:48 发布