单链表(有表头)——增删查改
目录
主函数
#include <stdio.h>
#include <stdlib.h>
struct hnode
{
int num;
struct hnode * next;
};
typedef struct hnode Hnode;
typedef Hnode * Hlink;
int main()
{
Hlink head = NULL;
Hlink new_node = NULL;
int i;
int loc;
int num;
create_hlink(&head);
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("old Hlink:\n");
display_link(head);
/* printf("please input location:\n");
scanf("%d",&loc);
create_new_node(&new_node);
printf("please input num:");
scanf("%d",&new_node->num);
//insert_node_mid_before(head,new_node,loc);
insert_node_mid_after(head,new_node,loc);
*/
printf("将链表从小到大排列!\n");
sort_hlink(head);
display_link(head);
printf("请输入要需要查找第几个结点:");
scanf("%d",&loc);
seek_node(head,loc);
printf("输入想修改的数字:");
scanf("%d",&num);
printf("输入修改后的数字:");
scanf("%d",&i);
modify_node(head,loc,i);
printf("please input the num you want to delete:");
scanf("%d",&loc);
delete_node(head,loc);
display_link(head);
make_empty(head);
display_link(head);
release_hlink(&head);
display_link(head);
return 0;
}
创建链表(有表头)
//创建带表头的链表
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 insert_node_mid_before(Hlink head,Hlink new_node,int loc)
{
Hlink p=NULL;
Hlink 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_node_mid_after(Hlink head,Hlink new_node,int loc)
{
Hlink p=NULL;
p=head;
while(p->next != NULL && p->num !=loc)
{
p=p->next;
}
new_node->next=p->next;
p->next=new_node;
}
删(删指定结点、删除头结点外的结点、全部删除)
//删除
void delete_node(Hlink head,int loc)
{
Hlink p=NULL;
Hlink q=NULL;
p=q=head;
int count=0;
int sum=0;
while(p!= NULL)
{
p=p->next;
sum++;
}
p=head;
if(p == NULL)
{
printf("delete:The link is empty!\n");
}
else
if(loc>sum)
{
printf("don't find.\n");
}
else
{
p=head;
while(p != NULL && count != loc)
{
q=p;
p=p->next;
count++;
}
if(p== NULL)
{
printf("don't find\n");
}
else
{
q->next=p->next;
free(p);
}
}
}
//清空——保留头结点
void make_empty(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)
{
make_empty(*head);
free(*head);
*head = NULL;
printf("空间释放!\n");
}
查(查指定结点、查所有)
//查找
void seek_node(Hlink head,int loc)
{
Hlink p;
int count=1;
p=head->next;
while(p!=NULL && count != loc)
{
p=p->next;
count++;
}
if(p == NULL)
{
printf("No this node.\n");
}
else
{
printf("第%d位的结点值是:%d\n",loc,p->num);
}
}
//遍历(查所有)
void display_link(Hlink head)
{
Hlink p=NULL;
if(NULL==head)
{
printf("No such link!\n");
}
else if(NULL == head ->next)
{
printf("Link is empty!\n");
}
else
{
p=head->next;
while(p != NULL)
{
printf("%4d",p->num);
p=p->next;
}
}
printf("\n");
}
改(排序、改指定结点)
//排序
void sort_hlink(Hlink head)
{
Hlink p1=NULL,p2=NULL,p3=NULL,end=NULL;
while(head->next != end)
{
for(p1=head,p2=p1->next,p3=p2->next;p3!=end;p1=p1->next,p2=p2->next,p3=p3->next)
{
if(p2->num > p3->num)
{
p1->next=p3;
p2->next=p3->next;
p3->next=p2;
Hlink t=p2;
p2=p3;
p3=t;
}
}
end=p2;
}
}
//修改
void modify_node(Hlink head,int num,int i)
{
Hlink p=NULL;
p=head->next;
while(p!= NULL && p->num != num)
{
p=p->next;
}
p->num=i;
display_link(head);
}
完整代码
#include <stdio.h>
#include <stdlib.h>
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 insert_node_mid_before(Hlink head,Hlink new_node,int loc)
{
Hlink p=NULL;
Hlink 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_node_mid_after(Hlink head,Hlink new_node,int loc)
{
Hlink p=NULL;
p=head;
while(p->next != NULL && p->num !=loc)
{
p=p->next;
}
new_node->next=p->next;
p->next=new_node;
}
//删除
void delete_node(Hlink head,int loc)
{
Hlink p=NULL;
Hlink q=NULL;
p=q=head;
int count=0;
int sum=0;
while(p!= NULL)
{
p=p->next;
sum++;
}
p=head;
if(p == NULL)
{
printf("delete:The link is empty!\n");
}
else
if(loc>sum)
{
printf("don't find.\n");
}
else
{
p=head;
while(p != NULL && count != loc)
{
q=p;
p=p->next;
count++;
}
if(p== NULL)
{
printf("don't find\n");
}
else
{
q->next=p->next;
free(p);
}
}
}
//查找
void seek_node(Hlink head,int loc)
{
Hlink p;
int count=1;
p=head->next;
while(p!=NULL && count != loc)
{
p=p->next;
count++;
}
if(p == NULL)
{
printf("No this node.\n");
}
else
{
printf("第%d位的结点值是:%d\n",loc,p->num);
}
}
//排序
void sort_hlink(Hlink head)
{
Hlink p1=NULL,p2=NULL,p3=NULL,end=NULL;
while(head->next != end)
{
for(p1=head,p2=p1->next,p3=p2->next;p3!=end;p1=p1->next,p2=p2->next,p3=p3->next)
{
if(p2->num > p3->num)
{
p1->next=p3;
p2->next=p3->next;
p3->next=p2;
Hlink t=p2;
p2=p3;
p3=t;
}
}
end=p2;
}
}
//修改
void modify_node(Hlink head,int num,int i)
{
Hlink p=NULL;
p=head->next;
while(p!= NULL && p->num != num)
{
p=p->next;
}
p->num=i;
display_link(head);
}
//遍历
void display_link(Hlink head)
{
Hlink p=NULL;
if(NULL==head)
{
printf("No such link!\n");
}
else if(NULL == head ->next)
{
printf("Link is empty!\n");
}
else
{
p=head->next;
while(p != NULL)
{
printf("%4d",p->num);
p=p->next;
}
}
printf("\n");
}
//清空——保留头结点
void make_empty(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)
{
make_empty(*head);
free(*head);
*head = NULL;
printf("空间释放!\n");
}
int main()
{
Hlink head = NULL;
Hlink new_node = NULL;
int i;
int loc;
int num;
create_hlink(&head);
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("old Hlink:\n");
display_link(head);
/* printf("please input location:\n");
scanf("%d",&loc);
create_new_node(&new_node);
printf("please input num:");
scanf("%d",&new_node->num);
//insert_node_mid_before(head,new_node,loc);
insert_node_mid_after(head,new_node,loc);
*/
printf("将链表从小到大排列!\n");
sort_hlink(head);
display_link(head);
printf("请输入要需要查找第几个结点:");
scanf("%d",&loc);
seek_node(head,loc);
printf("输入想修改的数字:");
scanf("%d",&num);
printf("输入修改后的数字:");
scanf("%d",&i);
modify_node(head,loc,i);
printf("please input the num you want to delete:");
scanf("%d",&loc);
delete_node(head,loc);
display_link(head);
make_empty(head);
display_link(head);
release_hlink(&head);
display_link(head);
return 0;
}
浙公网安备 33010602011771号