亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的建立與基本操作

 更新時(shí)間:2017年03月20日 08:43:09   投稿:lqh  
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的建立與基本操作的相關(guān)資料,需要的朋友可以參考下

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的建立與基本操作

雙向鏈表比單鏈表有更好的靈活性,其大部分操作與線性表相同。下面總結(jié)雙向鏈表與單鏈表之間的不同之處及我在實(shí)現(xiàn)過(guò)程中所遇到的問(wèn)題。

1.雙向鏈表的建立

雙向鏈表在初始化時(shí),要給首尾兩個(gè)節(jié)點(diǎn)分配內(nèi)存空間。成功分配后,要將首節(jié)點(diǎn)的prior指針和尾節(jié)點(diǎn)的next指針指向NULL,這是十分關(guān)鍵的一步,因?yàn)檫@是之后用來(lái)判斷空表的條件。同時(shí),當(dāng)鏈表為空時(shí),要將首節(jié)點(diǎn)的next指向尾節(jié)點(diǎn),尾節(jié)點(diǎn)的prior指向首節(jié)點(diǎn)。

2.雙向鏈表的插入操作

由于定義雙向鏈表時(shí)指針域中多了一個(gè)prior指針,插入操作相應(yīng)變得復(fù)雜,但基本操作也并不難理解。只需記住在處理前驅(qū)和后繼指針與插入節(jié)點(diǎn)的關(guān)系時(shí),應(yīng)始終把握好“有序原則”,即若將插入節(jié)點(diǎn)與兩個(gè)已存在的節(jié)點(diǎn)構(gòu)成三角形,則應(yīng)先處理“向上”的指針,再處理“向下”的指針。下面用代碼描述其過(guò)程:

pinsert->prior=p;
pinsert->next=p->next;
p->next->prior=pinsert;
p->next=pinsert;  

3.雙向鏈表的刪除操作

理解了雙向鏈表的插入操作后,刪除操作便十分容易理解。下面用代碼描述其過(guò)程:

 p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p);

雙向鏈表的其他操作與單鏈表類似,在此不再贅述,完整的代碼如下:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int status;
typedef int elemtype;
typedef struct node{
  elemtype data;
  struct node * next;
  struct node * prior;
}node;
typedef struct node* dlinklist;

status visit(elemtype c){
  printf("%d ",c);
}

/*雙向鏈表初始化*/
status initdlinklist(dlinklist * head,dlinklist * tail){
  (*head)=(dlinklist)malloc(sizeof(node));
  (*tail)=(dlinklist)malloc(sizeof(node));
  if(!(*head)||!(*tail))
    return ERROR;
  /*這一步很關(guān)鍵*/ 
  (*head)->prior=NULL;
  (*tail)->next=NULL;
  /*鏈表為空時(shí)讓頭指向尾*/
  (*head)->next=(*tail);
  (*tail)->prior=(*head);
}

/*判定是否為空*/
status emptylinklist(dlinklist head,dlinklist tail){
  if(head->next==tail)
    return TRUE;
  else
    return FALSE;
} 

/*尾插法創(chuàng)建鏈表*/ 
status createdlinklisttail(dlinklist head,dlinklist tail,elemtype data){
  dlinklist pmove=tail,pinsert;
  pinsert=(dlinklist)malloc(sizeof(node));
  if(!pinsert)
     return ERROR;
  pinsert->data=data;
  pinsert->next=NULL;
  pinsert->prior=NULL;
  tail->prior->next=pinsert;
  pinsert->prior=tail->prior;
  pinsert->next=tail;
  tail->prior=pinsert;
} 

/*頭插法創(chuàng)建鏈表*/ 
status createdlinklisthead(dlinklist head,dlinklist tail,elemtype data){
  dlinklist pmove=head,qmove=tail,pinsert;
  pinsert=(dlinklist)malloc(sizeof(node));
  if(!pinsert)
    return ERROR;
  else{
    pinsert->data=data;
    pinsert->prior=pmove;
    pinsert->next=pmove->next;
    pmove->next->prior=pinsert;
    pmove->next=pinsert;
  }
}

/*正序打印鏈表*/ 
status traverselist(dlinklist head,dlinklist tail){
  /*dlinklist pmove=head->next;
  while(pmove!=tail){
    printf("%d ",pmove->data);
    pmove=pmove->next;
  }
  printf("\n");
  return OK;*/
  dlinklist pmove=head->next;
  while(pmove!=tail){
    visit(pmove->data);
    pmove=pmove->next;
  }
  printf("\n");
}

/*返回第一個(gè)值為data的元素的位序*/
status locateelem(dlinklist head,dlinklist tail,elemtype data){
  dlinklist pmove=head->next;
  int pos=1;
  while(pmove&&pmove->data!=data){
    pmove=pmove->next;
    pos++;
  }
  return pos;
}

/*返回表長(zhǎng)*/
status listlength(dlinklist head,dlinklist tail){
  dlinklist pmove=head->next;
  int length=0;
  while(pmove!=tail){
    pmove=pmove->next;
    length++;
  }
  return length;
}

/*逆序打印鏈表*/
status inverse(dlinklist head,dlinklist tail){
  dlinklist pmove=tail->prior;
  while(pmove!=head){
    visit(pmove->data);
    pmove=pmove->prior;
  }
  printf("\n");
}

/*刪除鏈表中第pos個(gè)位置的元素,并用data返回*/
status deleteelem(dlinklist head,dlinklist tail,int pos,elemtype *data){
  int i=1;
  dlinklist pmove=head->next;
  while(pmove&&i<pos){
    pmove=pmove->next;
    i++;
  }
  if(!pmove||i>pos){
    printf("輸入數(shù)據(jù)非法\n");
    return ERROR;
  }
  else{
    *data=pmove->data;
    pmove->next->prior=pmove->prior;
    pmove->prior->next=pmove->next;
    free(pmove);
  }
}

/*在鏈表尾插入元素*/
status inserttail(dlinklist head,dlinklist tail,elemtype data){
  dlinklist pinsert;
  pinsert=(dlinklist)malloc(sizeof(node));
  pinsert->data=data;
  pinsert->next=NULL;
  pinsert->prior=NULL;
  tail->prior->next=pinsert;
  pinsert->prior=tail->prior;
  pinsert->next=tail;
  tail->prior=pinsert;
  return OK;
} 
int main(void){
  dlinklist head,tail;
  int i=0;
  elemtype data=0;
  initdlinklist(&head,&tail);
  if(emptylinklist(head,tail))
    printf("鏈表為空\(chéng)n");
  else
    printf("鏈表不為空\(chéng)n");
  printf("頭插法創(chuàng)建鏈表\n"); 
  for(i=0;i<10;i++){
    createdlinklisthead(head,tail,i);
  }
  traverselist(head,tail);

  for(i=0;i<10;i++){
    printf("表中值為%d的元素的位置為",i); 
    printf("%d位\n",locateelem(head,tail,i));
  }
  printf("表長(zhǎng)為%d\n",listlength(head,tail));
  printf("逆序打印鏈表");
  inverse(head,tail);
  for(i=0;i<10;i++){
    deleteelem(head,tail,1,&data);
    printf("被刪除的元素為%d\n",data);
  }
  traverselist(head,tail);
  if(emptylinklist(head,tail))
    printf("鏈表為空\(chéng)n");
  else
    printf("鏈表不為空\(chéng)n");
    printf("尾插法創(chuàng)建鏈表\n");
  for(i=0;i<10;i++){
    //inserttail(head,tail,i);
    createdlinklisttail(head,tail,i);
  }
  traverselist(head,tail);
  printf("逆序打印鏈表");
  inverse(head,tail);
}

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的通訊錄

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C/C++ memset方法的誤區(qū)

    C/C++ memset方法的誤區(qū)

    memset 作為對(duì)內(nèi)存初始化的函數(shù),還是有不少坑和誤區(qū)的,今天就來(lái)對(duì)這個(gè)函數(shù)作一個(gè)總結(jié)。避免后期使用不當(dāng)踩入坑,需要的朋友可以參考下
    2021-04-04
  • C++中CSimpleList的實(shí)現(xiàn)與測(cè)試實(shí)例

    C++中CSimpleList的實(shí)現(xiàn)與測(cè)試實(shí)例

    這篇文章主要介紹了C++中CSimpleList的實(shí)現(xiàn)與測(cè)試實(shí)例,較為詳細(xì)的講述了C++列表類的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2014-10-10
  • C++Stack棧類模版實(shí)例詳解

    C++Stack棧類模版實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了C++Stack棧類模版實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++11中模板隱式實(shí)例化與顯式實(shí)例化的定義詳解分析

    C++11中模板隱式實(shí)例化與顯式實(shí)例化的定義詳解分析

    實(shí)例化是為在程序中的函數(shù)模板本身并不會(huì)生成函數(shù)定義,它只是一個(gè)用于生成函數(shù)定義的方案。編譯器使用模板為特定類型生成函數(shù)定義時(shí),得到的是模板實(shí)例。這即是函數(shù)模板的實(shí)例化。而函數(shù)模板實(shí)例化又分為兩種類型:隱式實(shí)例化和顯式實(shí)例化
    2022-04-04
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的方法實(shí)例

    C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)等級(jí)劃分的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二)

    C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(63.不同的路徑之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單的學(xué)生管理系統(tǒng)

    本文給大家分享的是使用C++實(shí)現(xiàn)的簡(jiǎn)單的學(xué)生管理系統(tǒng)的代碼,主要是通過(guò)鏈表來(lái)實(shí)現(xiàn),非常簡(jiǎn)潔,有需要的小伙伴可以參考下。
    2015-07-07
  • 從頭學(xué)習(xí)C語(yǔ)言之指針和數(shù)組

    從頭學(xué)習(xí)C語(yǔ)言之指針和數(shù)組

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之指針和數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • C++實(shí)現(xiàn)與Lua相互調(diào)用的示例詳解

    C++實(shí)現(xiàn)與Lua相互調(diào)用的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)與Lua相互調(diào)用的方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03

最新評(píng)論