[데이터 구조] 순환 양 방향 링크 정의 와 기본 작업
8172 단어 데이터 구조
순환 양 방향 링크 의 정의:
typedef struct CDLNode{
LElemType data;
struct CDLNode * pre;
struct CDLNode * next;
CDLNode(LElemType Data=0,struct CDLNode* Pre=NULL,struct CDLNode* Next=NULL){
data=Data; pre=Pre; next=Next;
}
}CDLNode,*CDLinkList;
순환 양 방향 링크 기본 작업 의 실현:
(1) 、 초기 화 작업 InitDuLinkList( &L )
(2) 단일 체인 시트 를 만 드 는 작업 CreateDuLinkList(&L , n)
(3) 선형 표 가 빈 표 인지 판단 하기 ListIsEmpty (L)
(4), 선형 표 의 길이 ListLength (L)
(5), 선형 표 의 i 번 째 요소 GetElem (L, i, & e)
(6), 원소 e 가 선형 테이블 에 있 는 위치 찾기 LocateElem (L, e)
(7) 、 삽입 작업 ListInsert (& L, i, e)
(8) 、 삭제 작업 LIstDelete (& L, i, & e)
(1) 、 초기 화 작업 InitDuLinkList( &L )
void InitCDLinkList(CDLinkList &L){
L=new CDLNode(inf,NULL,NULL);
L->next=L->pre;
L->pre=L->next;
}
(2) 단일 체인 시트 를 만 드 는 작업 CreateDuLinkList(&L , n)
void CreateLinkList_Tail(CDLinkList &L,int n=0){ //
InitCDLinkList(L);
CDLinkList p=L,Pre=L;
Pre=L;
LElemType Data;
for(int i=1;i<=n;i++){
printf(" %d data :
",i);
cin>>Data;
p=new CDLNode(Data,Pre,L);
Pre->next=p;
Pre=p;
}
L->pre=Pre;
}
void CreateLinkList_Head(CDLinkList &L,int n=0){ //
InitCDLinkList(L);
CDLinkList p=L,Pre=L,s;
LElemType Data;
for(int i=1;i<=n;i++){
printf(" %d data :
",i);
cin>>Data;
p=new CDLNode(Data,L,L->next);
s=L->next;
if(i==1){
L->pre=p;
p->next=L;
}
if(s){
s->pre=p;
}
L->next=p;
}
}
(3) 선형 표 가 빈 표 인지 판단 하기 ListIsEmpty (L)
bool ListIsEmpty(CDLinkList &L){
return L->pre==L->next?false:true;
}
(4), 선형 표 의 길이 ListLength (L)
int ListLength(CDLinkList &L){
CDLinkList p=L->next;
int Len=0;
while(p!=L){
Len++;
p=p->next;
}
return Len;
}
(5), 선형 표 의 i 번 째 요소 GetElem (L, i, & e)
void GetElem(CDLinkList &L,int i,LElemType &e){
int j=1;
CDLinkList p=L->next;
while(p!=L&&jnext;
}
if(p==L||j>i){
printf("\" GetElem \" index %d error!!!
",i);
return ;
}
e=p->data;
}
(6), 원소 e 가 선형 테이블 에 있 는 위치 찾기 LocateElem (L, e)
int LocateElem(CDLinkList &L,LElemType e){
int j=1;
CDLinkList p=L->next;
while(p!=L&&p->data!=e){
p=p->next;
j++;
}
if(p==L){
printf("\"LocateElem\" not found %d
",e);
return -1;
}
return j;
}
(7) 、 삽입 작업 ListInsert (& L, i, e)
void ListInsert(CDLinkList &L ,int i,LElemType e){
int j=0;
CDLinkList p=L,s;
while(jnext!=L){
j++;p=p->next;
}
if((p==L||j>i-1)&&i!=1){
printf("\"ListInsert\" index : %d error!!!
",i);
}else{
s=new CDLNode(e,p,p->next);
p->next->pre=s;
p->next=s;
}
}
(8) 、 삭제 작업 LIstDelete (& L, i, & e)
void ListDelete(CDLinkList &L,int i,LElemType &e){
int j=0;
CDLinkList p=L,s;
while(jnext!=L){
j++;p=p->next;
}
if((p==L||j>i-1)&&i!=1){
printf("\"ListInsert\" index : %d error!!!
",i);
}else{
s=p->next;
p->next=s->next;
s->next->pre=p;
e=s->data;
delete s;
}
}
전체 디 버 깅 코드:
#include
#include
#include
#include
#define LElemType int
#define inf 0x3f3f3f3f
using namespace std;
typedef struct CDLNode{
LElemType data;
struct CDLNode * pre;
struct CDLNode * next;
CDLNode(LElemType Data=0,struct CDLNode* Pre=NULL,struct CDLNode* Next=NULL){
data=Data; pre=Pre; next=Next;
}
}CDLNode,*CDLinkList;
void InitCDLinkList(CDLinkList &L){
L=new CDLNode(inf,NULL,NULL);
L->next=L->pre;
L->pre=L->next;
}
void CreateLinkList_Tail(CDLinkList &L,int n=0){ //
InitCDLinkList(L);
CDLinkList p=L,Pre=L;
Pre=L;
LElemType Data;
for(int i=1;i<=n;i++){
printf(" %d data :
",i);
cin>>Data;
p=new CDLNode(Data,Pre,L);
Pre->next=p;
Pre=p;
}
L->pre=Pre;
}
void CreateLinkList_Head(CDLinkList &L,int n=0){ //
InitCDLinkList(L);
CDLinkList p=L,Pre=L,s;
LElemType Data;
for(int i=1;i<=n;i++){
printf(" %d data :
",i);
cin>>Data;
p=new CDLNode(Data,L,L->next);
s=L->next;
if(i==1){
L->pre=p;
p->next=L;
}
if(s){
s->pre=p;
}
L->next=p;
}
}
void OutputCDLinkList(CDLinkList &L){
CDLinkList p=L->next;
printf("
:
");
while(p!=L){
printf("%d
",p->data);
p=p->next;
}
p=p->pre;
printf("
:
");
while(p!=L){
printf("%d
",p->data);
p=p->pre;
}
printf("
");
}
bool ListIsEmpty(CDLinkList &L){
return L->pre==L->next?false:true;
}
int ListLength(CDLinkList &L){
CDLinkList p=L->next;
int Len=0;
while(p!=L){
Len++;
p=p->next;
}
return Len;
}
void GetElem(CDLinkList &L,int i,LElemType &e){
int j=1;
CDLinkList p=L->next;
while(p!=L&&jnext;
}
if(p==L||j>i){
printf("\" GetElem \" index %d error!!!
",i);
return ;
}
e=p->data;
}
int LocateElem(CDLinkList &L,LElemType e){
int j=1;
CDLinkList p=L->next;
while(p!=L&&p->data!=e){
p=p->next;
j++;
}
if(p==L){
printf("\"LocateElem\" not found %d
",e);
return -1;
}
return j;
}
void ListInsert(CDLinkList &L ,int i,LElemType e){
int j=0;
CDLinkList p=L,s;
while(jnext!=L){
j++;p=p->next;
}
if((p==L||j>i-1)&&i!=1){
printf("\"ListInsert\" index : %d error!!!
",i);
}else{
s=new CDLNode(e,p,p->next);
p->next->pre=s;
p->next=s;
}
}
void ListDelete(CDLinkList &L,int i,LElemType &e){
int j=0;
CDLinkList p=L,s;
while(jnext!=L){
j++;p=p->next;
}
if((p==L||j>i-1)&&i!=1){
printf("\"ListInsert\" index : %d error!!!
",i);
}else{
s=p->next;
p->next=s->next;
s->next->pre=p;
e=s->data;
delete s;
}
}
int main()
{
CDLinkList La;
LElemType e,t;
InitCDLinkList(La);
if(!ListIsEmpty(La)){
printf("La is empty!!!
");
}
// 、
//CreateLinkList_Tail(La,5);
CreateLinkList_Head(La,5);
OutputCDLinkList(La);
/*
, ,
int Len=ListLength(La);
if(ListIsEmpty(La)){
for(int i=0;i<=Len+1;i++){
e=inf;
GetElem(La,i,e);
e!=inf?printf("%d
",e):1;
}
}
*/
/*
printf(" :
");
scanf("%d",&e);
t=LocateElem(La,e);
if(t!=-1){
printf("%d Locate : %d
",e,t);
}
*/
/*
ListInsert(La,6,123);
OutputCDLinkList(La);
*/
e=inf;
ListDelete(La,5,e);
if(e!=inf){
printf("Delete : %d
",t);
}
OutputCDLinkList(La);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.