zoukankan      html  css  js  c++  java
  • 头插法创建链表

         要使用链表,就要先创建一个链表,这里只说单链表。先介绍一下头插法创建单链表链表。假如我们现在要在链表中插入一些数据:1、2、3、4、5,并从键盘输入这些数据,

    最后数据存入到链表中是反过来的,即{5,4,3,2,1},因为头插法每次都是在头部插入数据的,先插入1,此时表中数据为{1};接着在头部插入2,此时表中数据数据为{2,1};

    再在头部插入3,此时表中数据数据为{3,2,1};以此类推,最后,表中数据的顺序和你输入的顺序是相反的。

        为了弄明白头插法的原理,我在网上找了一张图来帮助理解头插法,看图

        

        所谓头插法,就是每次新加入的节点,都插入在表头结点的后面,插在表中第一个结点的前面,图中obj结点就插在了a0结点的前面,以此类推。最后你会发现表中数据的顺序与

    你输入的数据顺序是相反的。

        而头插法创建链表又分为两种情况,一种是已知节点个数,还有一种是未知节点个数,下面用代码来展示一下。先说一下未知结点个数的情况,即不确定输入的结点个数,看代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 typedef struct LNode
     4 {
     5     int data;
     6     struct LNode *next;
     7 }LNode,*LinkList;
     8 
     9 LinkList create_LinkList()
    10 {  
    11        LinkList head;   //声明头指针
    12        int  e;
    13        char ch;  
    14        LNode * p=NULL;
    15        head=(LinkList)malloc(sizeof(LNode));  //头插法创建链表需要创建表头
    16        head->next=NULL;        
    do{
    scanf("%d",&e);
    20 p=(LinkList)malloc(sizeof(LNode)); 21 p->data=e; 22 p->next=head->next; //插入在头部,让当前节点的next指向下一个结点 23 head->next=p; //表头指针指向当前结点 24 p=p->next; //p也指向下一个节点
    }while((ch=getchar())!=' ');
    27 return head; //返回头指针 28 } 29 int main() 30 { 31 LinkList p; 32 p=create_LinkList(); 33 p=p->next; //链表有头节点,让p跳过头结点,指向链表中的第一个结点 34 while(p!=NULL) 35 { 36 printf("%d ",p->data); 37 p=p->next ; 38 } 39 printf(" "); 40 return 0; 41 }

    结果如下:

        还有在已知结点个数的情况下,用代码展示一下

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #define N  10     //结点个数
     4 typedef struct LNode
     5 {
     6     int data;
     7     struct LNode *next;
     8 }LNode,*LinkList;
     9 
    10 LinkList create_LinkList()
    11 {  
    12        LinkList head;   //声明头指针
    13        LNode * p=NULL;
    14        head=(LinkList)malloc(sizeof(LNode));   //需要创建表头结点
    15        head->next=NULL;
    16        for(int i=1;i<=N;i++)
    17        {
    18           p=(LinkList)malloc(sizeof(LNode));
    19           scanf("%d",&p->data);
    20           p->next=head->next;
    21           head->next=p;
    22           p=p->next;
    23        }
    24        return head;
    25 } 
    26 int main()
    27 {
    28     LinkList p;
    29     p=create_LinkList();
    30     p=p->next;
    31     while(p!=NULL)
    32     {
    33        printf("%d ",p->data);
    34        p=p->next ;
    35     }
    36     printf("
    ");
    37     return 0;
    38 }

    结果如下:

     通过观察两次的结果,可以看出用头插法创建链表时都会产生这种情况:即插入的数据与插入的顺序相反。

  • 相关阅读:
    USACO 2.3 和为零 (DFS)
    公牛和母牛 (Standard IO)
    【NOIP2016提高A组模拟10.15】算循环
    USACO 2.2 集合(DP)
    USACO 2.2 序言页码 (MATH)
    NET实现微信公共平台上传下载多媒体文件(转)
    asp.net 模拟CURL调用微信公共平台API 上传下载多媒体文
    LINQ to SQL语句
    JS时间(日期)比较或相减(暂时停用)
    json格式字符串处理
  • 原文地址:https://www.cnblogs.com/buanxu/p/12795278.html
Copyright © 2011-2022 走看看