链表/堆栈(【常用方式】头节点不存放数据的方式)(C语言版)

常用的链表/堆栈 都是先 生成一个头指针head 再用头指针 申请一个 头节点空间,然后 头节点 的Data 一般是不储存数据的 ,

{ 当用 malloc函数分配内存后head就变为了名叫head的节点了。而不在是一个单独的指针了 }

{ 注意只要用malloc申请的空间 才能使 指针再 下次循环 指向不同的 内存空间 ,即每次申请的内存 地址都是一定不相同的,除非free了 这个内存空间,否则不可能再次被使用  }

当为链表/堆栈 为空时 则头节点 head->Next=NULL;否则则指向会储存 数据的普通节点;(这样实现的链表/堆栈 的空类型 判断 打印操作都比较方便)

【带头节点(不存放普通数据得)的引入是为了对链表删除、逆向、建立的时候操作更统一,不用专门对第一个元素单独处理。】3、大部分程序用带头节点来存储链表的长度。4、如何区分,很简单,看看程序的定义,和程序在建立链表的时候有没针对第一个节点做特殊处理。(做了特殊处理的,则说明头节点储存了数据/即没有头节点 ,只要头指针)
//说明的更加详细的博文-> https://blog.csdn.net/endeavor_g/article/details/80552680 #include<stdio.h>
#include <stdlib.h> 

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;//List是一个 struct Node 指针 

List Merge( List L1, List L2 );
List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */

int main(){
    List  L1,L2,L;
    L1 =  Read();
    L2 = Read();
//    Print(L1);
//    Print(L2);
    L=Merge( L1, L2 );
    printf("\n------\n");
    Print(L);
    Print(L1);
    Print(L2);
}
List Read() {
    List r,L=(struct Node*)malloc(sizeof(struct Node));
    L->Next=NULL;//创建一个头节点;一般链表都是带头节点的;头节点的 Data是没有存放数据的 ;当然也可以创建没有头节点的链表;
    //因为带有头节点的 链表,可以让print操作更加简练;因此链表都是有一个 不存放数据的头节点的; 【链表】
    r=L;
    int n;
    scanf("%d",&n);
    while(n--) {///尾插法
        Node *p=(struct Node*)malloc(sizeof(struct Node));
        scanf("%d",&p->Data);
        p->Next=NULL;
        r->Next=p;
        r=p;
    }
    return L;
}
void Print(List L) {
    if(L->Next) {
        List r=L;
        while(r->Next) {
            r=r->Next;
            printf("%d ",r->Data);
        }
        puts("");
    } else {
        printf("NULL\n");
    }
}
List Merge(List L1,List L2){
    List p1,p2,p3,head;
    head=(struct Node*)malloc(sizeof(struct Node));
    p3=head;
    p3->Next=NULL;
    p1=L1->Next,p2=L2->Next;
    while(p1&&p2){
        if(p1->Data<=p2->Data){
            p3->Next=p1;
            p3=p3->Next;
            p1=p1->Next;
        }else{
            p3->Next=p2;
            p3=p3->Next;
            p2=p2->Next;
        }
    }
    p3->Next=p1?p1:p2;
    L1->Next=NULL;
    L2->Next=NULL;
    return head;
}

原文地址:https://www.cnblogs.com/home979/p/9226861.html

时间: 2024-10-18 02:33:04

链表/堆栈(【常用方式】头节点不存放数据的方式)(C语言版)的相关文章

C语言初级链表(之有头节点的单向链表)

1.结构体的基本特点:(结构体中可以嵌套一个别的结构体:  ..........可以嵌套一个别的结构体指针) (结构体中不可以嵌套一个自身类型的结构体(原因:确定不了结构体的内存大小): ..........可以嵌套一个指向自身类型的指针(原因:不同类型的指针在同一操作平台下所占内存相同,有确定值) 2.数据类型的本质:固定大小的内存块别名. 3.链表的基础特点:(结构体: 两个域:数据域.指针域:  引用自身的结构体:  特点:非线性存储) 4.链表编程关键两点: 1)指针指向谁,就把谁的地址

链表之 头节点与尾指针 区别

单链表的必要条件:头节点的head,以及尾指针指向null: 1 头结点 首先,不要被以下三个词组弄混了: 链表头:数据内容为第一个元素的结点. 头指针:指向头结点元素的指针. 头结点:数据内容无效,其指针是头指针. 一句话描述为:头指针是指向头结点的指针,头结点是指向链表头的结点. 对于一个链表来说,头指针是一定存在的,是访问链表的入口,如果没有头指针则无法对其进行访问:链表头对于非空表来说是一定存在的,非空表则不存在. 2 尾指针 另外一种链表的技巧是使用尾指针. 尾指针是相对于头指针而言的

存储过程存放数据方式

存储过程存放数据的方式主要有: 1.将数据存放到文件中:select c_content into outfile 'D:\\action.properties'; 2.将数据保存到数据库中: 存储过程的功能非常强大,在某种程度上甚至可以替代业务逻辑层.

删除一个没有头节点链表中的某个节点

题目描述:给定一个链表,没有头节点,如何删除其中的某个随机节点呢? 分析:如果一个链表没有头节点的话,那么我们就不可以找到被删除节点的前面一个节点.如何按照这个思路来,就无法实现功能了. 不如我们换一个思路,删除节点的目的是什么?是要达到被删除节点中的data被删除,也就是说,我们实际上只需要删除该节点的data,而不是整个节点.如何实现呢?我们可以把需要删除节点的后面一个节点中的data,依次往前面赋值,并把此节点删除,即可.例如:ABCD三个节点,假如我们需要删除B节点,那么我们可以把C->

两个链表的第一个公共节点

已知有两个链表,他们可能相交于某一点,求出该点. 方法1.对于第一个链表,每访问一个节点,对该节点做标记.访问第二个链表,如果该元素已经访问,则第一个这样的元素就是所求点. 由于两个链表都访问了一遍,因此时间复杂度O(m+n),空间复杂度O(m)或O(n) 方法2.我们定义节点的距离为节点到链表开始所经过的节点数.如果两个链表长度相同,则相交节点其在两个链表上的距离一定相等.对于长度不同的两个链表,我们可以采用对齐的方式,使其向长度短的链表对齐.这样就可以应用上面的思路.具体算法如下: [cpp

求链表的第一个公共节点问题(好未来笔试题)

问题描述:给定两个链表的头指针,判断两个链表是否存在公共节点,如果存在公共节点,则找出第一个公共节点. 分析:这曾经是我参加好未来的一道笔试题目,给大家分享下解法. 解法一:蛮力法.拿第一个链表的每个节点去和第二个链表的每个节点进行比较,如果都不相同,则判断出两个链表不相交. 否则输出第一个相同的节点.算法的时间复杂度为O(m*n). 解法二:辅助空间法.仔细观察可以发现,如果两个链表想要相交,则尾节点必是相交点,否则不相交. 因此我们可以从两个链表的尾部开始进行比较,如果不相同,直接判断出不相

iOS 常用四种数据存储方式

iOS 常用四种数据存储方式 在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅, ,使得用户体验更好.下面介绍?一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前?一个方法告诉系统怎么对对象进行编码,而后?一个方法则是告诉系统怎么对对象进行解码.例如对Possession对

复习一下单链表的常用操作

复习一下单链表的常用操作,包括单链表的创建.插入.删除.排序.逆置以及打印输出等. #include<IOSTREAM> using namespace std; typedef struct Single_link { int data; struct Single_link *next; }node; //单链表的创建 node *Create() { node *head,*p,*s; int x,cycle=1; head=(node *)malloc(sizeof(node)); p

ASP.NET配置文件中常用到的节点信息

 web.config文件是一个XML文件,是以<confirguration>为根结点展开的.上一面从宏观上讲解了一下有关配置的文件的内容,下面是一些有关于配置文件常用的操作.图片请详见下图 .config常用操作 <appSettings>节点 主要用来存储asp.net应用程序的一些配置信息,个人感觉是存储一些以后可能会变化的配置信息.例如网页中上传文件的保存路径.个人曾做过有关XML一个小型的数据库,通过<appSettings>来反射XML文件的保存路径