单链表(有表头)——增删查改

目录

主函数

创建链表(有表头)

增(头插、尾插、前插、后插)

删(删指定结点、删除头结点外的结点、全部删除)

查(查指定结点、查所有)

改(排序、改指定结点)

完整代码


主函数

#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;
}

​
posted on 2022-02-17 21:43  慧茗子  阅读(36)  评论(0)    收藏  举报  来源