链表的一些简单操作

本文详细介绍了链表的一些简单的操作,包括链表的创建、遍历、查询、插入、删除、排序、逆序、释放。另附运行结果。

#include <stdio.h>
#include <stdlib.h>

typedef struct student
{
    int num;
	int score;
	char name[20];
	struct student *next;
}STU;

void link_create(STU **head, STU *p_new)//创建链表
{
    STU *p_mov = *head;
	
    if (*head == NULL)
    {
        *head = p_new;
		p_new->next = NULL;
	}
	else
	{
        while (p_mov->next != NULL)//找到最后的位置
        {
            p_mov = p_mov->next;
		}
		p_mov->next = p_new;
		p_new->next = NULL;
	}
}

void link_print(STU *head)//遍历链表
{
    STU *p_mov = head;

	while (p_mov != NULL)//遍历所有的节点
	{
	    printf("num: %d,score: %d,name: %s\n",p_mov->num,
			p_mov->score,p_mov->name);
        p_mov = p_mov->next;
	}
	
}


STU *link_search_num(STU *head, int num)//查询链表
{
    STU *p_mov = head;

	if (head = NULL)
	{
        printf("Sorry,Link is NULL!\n");
	}
	else 
	{
        while (p_mov != NULL)
        {
            if (p_mov->num == num)//找到要查找的节点
				return p_mov;
			else
                p_mov = p_mov->next;
		}
		
		if (p_mov == NULL)
		printf("No such Node!\n");
		
		return NULL;
	}
}

void link_delete_num(STU **head, int num)//删除链表
{
    STU *p_mov = *head;
    STU *pf = NULL;

	if (*head == NULL)
	{
        printf("Link is NULL!\n");
		return ;
	}
	while (p_mov->num != num && p_mov->next != NULL)
	{
        pf = p_mov;
		p_mov = p_mov->next;
	}
	if (p_mov->num == num)
	{
	    if (p_mov == *head)//要删除的节点是头结点
	    {
            *head = p_mov->next;
			free(p_mov);
		}
		else//要删除的节点是其它节点
		{
            pf->next = p_mov->next;
			free(p_mov);
		}
	}
	else
	{
        printf("No such student you want to delete!\n");
	}
}

void link_insert_num(STU **head, STU *p_new)//插入链表
{
    STU *pf,*pb;
	pb = *head;

	if (*head == NULL)
	{
        *head = p_new;
		p_new->next = NULL;
		return ;
	}
	while (p_new->num >= pb->num && pb->next != NULL)
	{
        pf = pb;
		pb = pb->next;
	}
	if (p_new->num < pb->num)//找到插入的合适的位置
	{
        if (pb == *head)
        {
            p_new->next = *head;
			*head = p_new;
		}
		else
		{
            pf->next = p_new;
			p_new->next = pb;
		}
	}
	else
	{
        pb->next = p_new;
		p_new->next = NULL;
	}
}
void link_order(STU *head)//链表排序
{
    STU *pb = NULL;
	STU temp;
	STU *pf = head;

	if (head == NULL)
		return ;
	while (pf->next != NULL)
	{
        pb = pf->next;
		while (pb != NULL)
		{
            if (pf->num > pb->num)
            {
                temp = *pb;
				*pb = *pf;
				*pf = temp;
				temp.next = pb->next;
				pb->next = pf->next;
				pf->next = temp.next;
			}
			pb = pb->next;
		}
		pf = pf->next;
	}
}

STU *link_reverse(STU **head)//链表逆序
{
    STU *pf,*pb,*r;
	if (*head == NULL)
		return ;
	if ((*head)->next == NULL)
		return ;
	pf = *head;
	pb = pf->next;
	pf->next = NULL;//记录头结点节点的下一个节点,然后将头结点逆序

	while (pb != NULL)//记录要逆序的节点的下一个节点,然后逆序
	{					
        r = pb->next;
		pb->next = pf;
		(*head) = pb;//移动头指针,使其始终指向头结点
		pf = pb;//移动其它指针,为下一次循环准备
		pb = r;
	}

	return (*head);
}

void link_free(STU **head)//链表释放
{
    STU *pb;
	while(*head != NULL)
	{
        pb = *head;
		*head = (*head)->next;
		free(pb);
	}
}
int main(int argc, char * argv [ ])
{
    int number = 0;
	int i = 0;
	char disbuff[50] = "";
	STU *p_new = NULL;
	STU *head = NULL;
	STU *result = NULL;
	
    printf("Please enter the number to create link.\n");
	scanf("%d",&number);
	
	for (i=0;i<number;i++)
	{
		sprintf(disbuff,"please enter the num of %d message.",i);
		printf("%s\n",disbuff);
		p_new = (STU *)malloc(sizeof(STU));
		scanf("%d %d %s",&p_new->num,&p_new->score,p_new->name);
		link_create(&head, p_new);
	}
	link_print(head);
	
	printf("-------------------------------------------------------------\n");
	link_order(head);
	link_print(head);
	
	printf("-------------------------------------------------------------\n");
	printf("Please enter the num you want to search:\n");
	scanf("%d",&number);
	result = link_search_num(head, number);
	if (result != NULL)
	{
        printf("result:num:%d, score:%d, name:%s\n",
			result->num,result->score,result->name);
	}
	
	printf("-------------------------------------------------------------\n");
	printf("Please enter the num you want to delete:\n");
	scanf("%d",&number);
	link_delete_num(&head, number);
	link_print(head);
	
	printf("-------------------------------------------------------------\n");
	printf("Please enter the num score name you want to insert:\n");
	p_new = (STU *)malloc(sizeof(STU));
	scanf("%d %d %s",&p_new->num,&p_new->score,p_new->name);
	link_insert_num(&head,p_new);
	link_print(head);
	
	printf("-------------------------------------------------------------\n");
	link_reverse(&head);
	link_print(head);
}
一个运行示例:

[link]gcc link_print.c 
[link]./a.out 
Please enter the number to create link.
4
please enter the num of 0 message.
11 77 qq
please enter the num of 1 message.
22 88 ww
please enter the num of 2 message.
33 97 ee
please enter the num of 3 message.
21 89 rr
num: 11,score: 77,name: qq
num: 22,score: 88,name: ww
num: 33,score: 97,name: ee
num: 21,score: 89,name: rr
-------------------------------------------------------------
num: 11,score: 77,name: qq
num: 21,score: 89,name: rr
num: 22,score: 88,name: ww
num: 33,score: 97,name: ee
-------------------------------------------------------------
Please enter the num you want to search:
22
result:num:22, score:88, name:ww
-------------------------------------------------------------
Please enter the num you want to delete:
33
num: 11,score: 77,name: qq
num: 21,score: 89,name: rr
num: 22,score: 88,name: ww
-------------------------------------------------------------
Please enter the num score name you want to insert:
18 99 tt
num: 11,score: 77,name: qq
num: 18,score: 99,name: tt
num: 21,score: 89,name: rr
num: 22,score: 88,name: ww
-------------------------------------------------------------
num: 22,score: 88,name: ww
num: 21,score: 89,name: rr
num: 18,score: 99,name: tt
num: 11,score: 77,name: qq



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值