• 名单(两)——基本操作单向链表(创、删、印、节点统计数)


    1.指针联动
    通过两个指针指向前任和后继节点,而移动一个单向链表,当被处理的指针的节点,节点的前体也有一个指针。
    2.有一种无序单向链表。和数据字段值不一样。指针pmin最小点值节点,和指针prem最小点值结点的前驱结点:
    代码片段:
    for(p = head; p; q = p, p = p->next)
    {
        if(pmin->data > p->data)
        {
            pmin = p;
            prem = q;
        }
    }
    3.单向链表的删除算法
    注:使用malloc函数分配的结点单元必须使用free函数来释放。free(p)之后,p所指向的单元被释放。p被系统又一次赋值为随机值,p仅仅能在程序执行完毕之后自己主动清除。
    头结点的删除:head = head->next;free(pdel);
    非头结点的删除:ppre->next = pdel->next;free(pdel);
    4.样例
    注:单向链表的最主要的操作,新建一个链表、删除一个元素、打印链表、统计链表的个数、删除链表。

    #include <stdio.h>
    #include <malloc.h>
    
    #define NULL	0
    
    typedef struct node {
    	int data;
    	struct node *next;
    }ElemSN;
    
    
    ElemSN * creat_link(int ms); //逆向创建一个链表
    void print_link(ElemSN *head); //输出单向链表
    ElemSN * delete_node(ElemSN *head, int x); //删除链表中的一个结点
    int count_link(ElemSN *head); //统计单向链表结点的个数
    ElemSN * clear_link(ElemSN *head); //删除链表
    
    int main()
    {
    	ElemSN *head;
    	int ms, x;
    
    	printf("Please input node number:");
    	scanf("%d", &ms);
    	head = creat_link(ms);
    	print_link(head);
    	printf("Please input delete node:");
    	scanf("%d", &x);
    	head = delete_node(head, x);
    	print_link(head);
    	printf("link member is :%d
    ", count_link(head));
    	head = clear_link(head);
    }
    
    ElemSN * creat_link(int ms)
    {
    	ElemSN *h = NULL, *p;
    	int i, x;
    
    	for(i = 0; i < ms; i++)
    	{
    		printf("Please input data:");
    		scanf("%d", &x);
    		p = (ElemSN *)malloc(sizeof(ElemSN));
    		p->data = x;
    		p->next = h;
    		h = p;
    	}
    
    	return h;
    }
    
    void print_link(ElemSN *head)
    {
    	for(; head; head = head->next)
    	{
    		printf("%d ", head->data);
    	}
    	printf("
    ");
    }
    
    ElemSN * delete_node(ElemSN *head, int x)
    {
    	ElemSN *p = NULL, *q = NULL;
    	
    	if(NULL == head)
    	{
    		return NULL;
    	}
    	for(p = head; p && p->data != x; q = p, p = p->next); //p && p->data != x不能交换位置
    
    	if(NULL == p) //没有找到要删除的结点
    	{
    		return head;
    	}
    
    	if(NULL == q) //要删除的是头结点
    	{
    		head = head->next;
    	}
    	else
    	{
    		q->next = p->next;
    	}
    	free(p);
    
    	return head;
    }
    
    int count_link(ElemSN *head)
    {
    	int count = 0;
    	
    	for(; head; count++, head = head->next);
    
    	return count;
    }
    
    ElemSN * clear_link(ElemSN *head)
    {
    	ElemSN *p;
    
    	while(head)
    	{
    		p = head->next;
    		free(head);
    		head = p;
    	}
    
    	return head;
    }

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Qt QChart 中 QValueAxis 和 QCategoryAxis 区别
    Qt QChart 绘制面积图 QAreaSeries
    Qt QChart 设置线条样式 虚线
    Qt 读取csv文件并且绘制折线图
    Qt comboBox控件的三种基本用法
    Qt QStringList 的学习笔记
    OpenYurt 联手 eKuiper,解决 IoT 场景下边缘流数据处理难题
    如何避免 Go 命令行执行产生“孤儿”进程?
    阿里巴巴代码平台架构的演进之路
    云原生演进趋势下传统数据库升级实践
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4835185.html
Copyright © 2020-2023  润新知