• 单链表的创建


    在进行单链表的基本运算之前必须先建立单链表,建立单链表的常用方法有两种:头插法建表和尾插法建表

    头插法建表,从一个空表开始,读取字符数组a中的字符,生成新节点,将读取的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头上,直到读完字符数组a的所有元素为止。

    核心代码:

    s->next = L->next;  // 新节点指向开始节点
    L-next = s;  // 头结点指向s节点,使s成为开始节点

    头插法建表虽然简单,但生成的链表中节点的次序和原数组的次序相反,若希望两者的次序一致,可采用尾插法建立

    尾插法建表,该算法是将新节点插到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾节点

    核心代码:

          r->next=s;//将s插入到r后  r在前面初始化为 r = L  r是尾指针
          r=s;//使r指向尾结点

     实现代码:

     1 #include <cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cstdlib>
     5 
     6 using namespace std;
     7 
     8 typedef int ElemType;
     9 typedef struct LNode{
    10    ElemType data;  //存放元素值
    11    struct LNode *next;//指针域指向后继结点
    12 }ListNode;
    13 
    14 
    15 //头插法建表
    16 void CreateListHead(ListNode *&L,ElemType a[],int n){
    17 
    18     ListNode *s;
    19     L=(ListNode *)malloc(sizeof(ListNode));//创建头结点
    20     L->next=NULL;   //将头结点next域置空
    21 
    22     for(int i=0;i<n;i++){   //循环建立数据结点
    23         //创建数据结点*s
    24         s=(ListNode *)malloc(sizeof(ListNode));
    25 
    26         //将结点s插在原开始节点之前,头结点之后
    27         s->data=a[i];
    28         s->next=L->next;
    29         L->next=s;
    30     }
    31 }
    32 
    33 //尾插法建表
    34 void CreateListTail(ListNode *&L,ElemType a[],int n){
    35     ListNode *s,*r;
    36     L=(ListNode *)malloc(sizeof(ListNode));//创建头结点
    37     L->next = NULL; //将头结点next域置空
    38     r=L;//r始终指向尾结点,开始时头结点和尾结点是同一个
    39 
    40     for(int i=0;i<n;i++){
    41       s=(ListNode *)malloc(sizeof(ListNode));//创建数据结点
    42 
    43       s->data=a[i];//数据域
    44       r->next=s;//将s插入到r后
    45       r=s;//使r指向尾结点
    46     }
    47 
    48     r->next=NULL;//尾指针指针域置空
    49 
    50 }
    51 //输出
    52 void DispList(ListNode *L){
    53     ListNode *p=L->next;//p指向开始结点
    54 
    55     while(p!=NULL)
    56     {
    57         cout<<p->data<<" "; //输出数据域
    58         p=p->next;
    59     }
    60     cout<<endl;
    61 }
    62 int main(){
    63     ListNode *L;
    64     int n;
    65     cout<<"n:";
    66     cin>>n;
    67 
    68     int *a=new int(n);
    69     for(int i=0;i<n;i++){
    70       cin>>a[i];
    71     }
    72     //头插法建表
    73     CreateListHead(L,a,n);
    74     cout<<"头插法建表:";
    75     DispList(L);//输出
    76 
    77     //尾插法建表
    78     CreateListTail(L,a,n);
    79     cout<<"尾插法建表:";
    80     DispList(L);//输出
    81 }

     

    参考:

    https://blog.csdn.net/zmeilin/article/details/81193514

  • 相关阅读:
    Transcation And Lock--SQL SERVER 事务隔离级别
    Transaction And Lock--常用的查询事务和锁的语句
    使用shell读取文本文件发送到kafka
    VIM打开shell脚本中文乱码解决
    shell中日期操作
    oozie常见错误问题
    error: No implicit Ordering defined for Any
    启动mysql时显示:/tmp/mysql.sock 不存在的解决方法
    mysql中创建用户和赋权限
    (转)maven3.3.9编译oozie4.3.0
  • 原文地址:https://www.cnblogs.com/xiaokang01/p/12409914.html
Copyright © 2020-2023  润新知