リニアテーブル - 単一リンクリストの基本的な操作

定義やプレゼンテーションのシングル一覧

単鎖は、データ構造にアクセスするチェーンのセットです。住所任意の線形リスト内のデータ要素を記憶するメモリセル。

データがリストにリンクされていますノード示される2つのドメインを構成する各ノードは、前記データ要素の情報となる前記ドメインを記憶しますデータフィールド(データ)、直後の後続フィールド、記憶位置を参照しますポインタフィールド(次の)
ここに画像を挿入説明

単独でリンクされたリスト・ポインタを一意ヘッドによって決定されるので、単一のリンクリストを使用することができます先頭ポインタにちなんで命名ヘッド・ポインタ名がLである場合、そのリストは、単に、表Lに呼ばれています

単一リンクリストのヘッドポインタを一意に、C言語で使用される言語を決定することができる-structuredポインタを記述するために:

//单链表的存储结构
typedef struct LNode
{
    ElemType data;        //结点的数据域
    struct LNode *next;   //结点的指针域
}LNode,*LinkList;         //LinkList为指向结构体LNode的指针类型

第1の差分要素ノード、最初のノード、先頭ポインタ。

  • 首元结点これは、A1に格納されたリストの最初の要素のノードを指し
  • 头结点ノードの最初のエレメントに接続されたノードの前のノードが、最初の要素ポインタフィールドポイントであります
  • 头指针最初のノードは、ポインタのリンクリストへのポインタであります
    ここに画像を挿入説明

リストのヘッドノードの役割を増やします。

  • 最初の要素ノードの取り扱いを容易にします
  • 単一の非空のテーブルを容易にするために、空のテーブル

単一リンクリストの基本的な操作を実現


①単一のリストの初期化(空のテーブル構成)

[]アルゴリズムステップ

  • 第1のノードLを指すヘッドポインタと、最初のノードとして新しいノードを生成します
  • ヘッドノードポインタフィールドブランキング

[説明]アルゴリズム

Status InitList(LinkList &L)
{  
    L=new LNode;   //生成一个新结点作为头节点,用头指针L指向头节点
    L->next NULL;  //头节点指针域置空
    return OK;
 }

注:
L =新しい新しいlノード(C ++)のように書くことができる
L =(LINKLIST)はmalloc(はsizeof (lノード));©

malloc関数の使用状況(C):

  • malloc関数は無効に指定された領域の連続したメモリブロックのサイズ印加するため、動的メモリ割り当て関数で戻り型割り当てられたメモリ領域のアドレス(ボイド不定型ポインタ)
  • 使用終了後の使用のmallocオープンスペース使用する場合はfree函数释放スペースのを
  • malloc関数ポインタ型の前に追加されなければならない强制转换だけに使用することができます
  • ヘッダファイルstdlib.h
  • 指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p=NULL;
int n =5;
p=(int*)malloc(sizeof(int)*n);
}

フリー機能の使用状況(C):

  • メモリ空間のポインタ変数を割り当てるためにmalloc(またはのcalloc、reallocの)機能を解除します。
  • ポインタを使用した後、変数の再する必要があります指向NULL
#include<stio.h>
#include<stdlib.h>
int main()
{  
    int *p=( int*)malloc(sizeof(int)) ;
    *p=5;
    free(p);
    p=NULL;
}    

②破壊の単一のリスト(ヘッドノード、ヘッドポインタ、すべての要素が破壊されます)

[アルゴリズム]アイデア
スクラッチ開始ポインタ、順次全てのノードのリリース
[アルゴリズム記述

Status DestoryList_L(LinkList &L)
{
     LinkList p;   //或Lnode *p;p为指针变量
     while(L)      //L非空 
     { 
        p=L;       //p、L指向同一结点
        L=L->next; //L指针指向下一个结点
        delete p;  //删除结点p
       } 
}      

③単独リンクリストを空にする (ヘッドポインタ、依然としてヘッドノード)

[アルゴリズム]アイデア
順次NULLにすべてのノードと、ヘッドノードポインタフィールドセットを解放
[アルゴリズム記述を

Status ClearList(LinkList &L)
{
    Lnode *p,*q;  //或LinkList p,q;
    p=L->next;
    while(p)      //非空,没到表尾
    {
      q=p->next;  //q指向p的下一个结点
      delete p;   //销毁p
      p=q;        //使p、q指向同一结点
     }
   L->next=NULL;  //将头节点指针域置为空
   return OK;  

④単一リンクリストテーブルの長さを求めて

[アルゴリズム]のアイデア
最初の要素ノードから開始し、すべてのノードが順次カウント
説明アルゴリズム]

int ListLength_L(LinkList L)
{
    Linklist p;  //或Lnode *p;
    p=L->next;   //p指向第一个结点
    i=0;         //计数器i
    whilw(p)     //遍历单链表,统计结点数
    {
      i++;
      p=p->next;  //p指向下一个结点
     }
}     

⑤i番目の要素の値をとりますO(n)

[思考]アルゴリズム
第1ノード元から、ダウンつのドメインの次のノードへのアクセスにより、チェーン1ダウン
[アルゴリズム記述]

Status GetElem(LinkList L,int i,ELemType &e)
{
     p=L->next;j=1;  //p指向首元结点,计数器j=1
     while(p&&j<i)   
     {
       p=p->next;    //p指向下一个结点
       ++j;
      }
      if(!p||j>i)  return ERROR;   //i不合法i>n或i≤0
      e=p->data;       //取第i个结点的数据域
      return OK;
}       

値によって検索⑥O(n)

[アルゴリズム]アイデア
第1ノード要素からは、順次、次の探索鎖ドメインの下に沿って見つけるまでに等しいまたは空E
[アルゴリズム記述

LNode *LocateElem(LinkList L,ElemType e)
{
    p=L->next;       //p指向首元结点
    while(p&&p->data!=e)  //顺链向后扫描,直到p为空或p所指数据域=e
      p=p->next;     //p指向下一个结点
    return p;        //若查找成功返回e的结点地址p,查找失败p为NULL
 }

⑦挿入ノードO(n)

[アルゴリズム]の考え
新しいノードは、(i-1)に挿入し、テーブル上の位置E i番目のノード、すなわち、中に挿入される(I)との間のA(I-1)となりますE A(I)ポインティング・ノード・ポインタ・フィールドのデータ・フィールドの新しいノードEのデータ・フィールドへのポインタフィールドポイント
ここに画像を挿入説明
[アルゴリズム記述

Status ListInsert(LinkList &L,int i,ElemType e)
{
    p=L;j=0;          //p指向头结点
    while(p&&(j<i-1))
    {
       p=p->next;++j;  //查找第i-1个结点,p指向该结点
     }
     if(!p||j>i-1)  return ERROR;   //i>n+1或i<1
     s=new LNode;      //生成新结点*s
     s->data=e;        //将结点*s的数据域置为e
     s->next=p->next;  //将结点*s的指针域指向结点a(i)
     p->next=s;        //将结点*p的指针域指向结点*s
     return OK;
}    

⑧削除ノードO(n)

[アルゴリズム]アイデアは、
その結果(I-1)へのポインタフィールドポイント(I + 1)、ノードの単一のリンク・リストI(i)および(I)空間の放出を削除します

ここに画像を挿入説明
[説明]アルゴリズム

Status ListDelete(LinkList &L,int i)
{
     p=L;j=0;               //p指向头结点
     while((p->next)&&(j<i-1))
     {
       p=p->next;
       ++j;                //查找第i-1个结点,p指向该结点
      }
      if(!(p->next)||(j>i-1))  return ERROR;   //i>n或i<1时,删除位置不合理
      q=p->next;          //临时保存被删除结点的地址以备释放
      p->next=q->next;    //改变删除结点前驱结点的指针域
      delete q;           //释放删除结点的空间
      return OK;
 }     
       

単一のリストを作成します⑨前方に法律を実行しますO(n)

[アルゴリズム]思考
n個の要素の逆入力値を、ヘッダノードと単一のリストLの確立
[アルゴリズム記述

void CreateList_H(LinkList &L,int n)
{
    L=new LNode;
    L->next=NULL;        //先建立一个带头节点的空链表
    for(i=0;i<n;++i)
    {
      p=new LNode;       //生成新结点*p
      cin >> p-data;     //输入元素值赋给新结点*p的数据域
      p->next=L-next; L->next=p;   //将新结点*p插入到头节点之后
    }
}      

補間後の単一のリストを作成します⑩O(n)

[アルゴリズム]思考
n個の要素の正のシーケンスの入力値を、単一の連結リストノードLとヘッダの確立
ここに画像を挿入説明
[アルゴリズム記述

void CreatList_R(LinkList &L,int n)
{
    L=new LNode;
    L->next=NULL;       //先建立一个带头节点的空链表
    r=L;                //尾指针r指向头节点
    for(i=0;i<n;++i)
    {
       p=new LNode;      //生成新结点
       cin >> p->data;   //输入元素值赋给新结点*p的数据域
       p->next=NULL;r->nextp;    //将新结点*p插入尾结点*r之后
       r=p;    //r指向新的尾结点*p
     }
}      

参考:「データ構造」ヤン魏ミン

リリース5元の記事 ウォン称賛22 ビュー1615

おすすめ

転載: blog.csdn.net/wmy0217_/article/details/103936065