가장 중요한 것은 헤드 포인터와 테일 포인터를 정의하는 것입니다. (테일 포인터는 정의하지 않을 수 있지만 코드 중복이 늘어나고 프로그램 실행 시간이 늘어납니다. );
꼬리 추가에 대해: (노드가 없는 것과 노드가 없는 것을 구별하는 데 주의하세요)
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void endadd(struct Mystruct **phead,struct Mystruct **pend, int adddata); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; endadd(&phead,&pend,4); ...... return 0; } void endadd(struct Mystruct **phead,struct Mystruct **pend, int adddata) { struct Mystruct *pt = (struct Mystruct *)malloc(sizeof(struct Mystruct)); if(NULL == pt) return; pt->data = adddata; pt->pnext = NULL; if(NULL == *phead) { *phead = pt; } else { (*pend)->pnext = pt; } *pend= pt; }
코드 아이디어는 기본적으로 꼬리 추가와 동일합니다. 노드의 링크를 구별하는 데 주의하세요.
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void head_add(struct Mystruct **phead,struct Mystruct **pend, int adddata); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; head_add(&phead,&pend,4); ...... return 0; } void head_add(struct Mystruct **phead,struct Mystruct **pend, int adddata) { struct Mystruct *pt = (struct Mystruct *)malloc(sizeof(struct Mystruct)); if(NULL == pt) return; pt->data = adddata; pt->pnext = NULL; if(NULL == *phead) { *pend = pt; } else { pt->pnext = (*phead); } *phead= pt; }
루프를 사용하여 헤드 추가 또는 테일 추가를 직접 호출:
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void circulate_add(struct Mystruct **phead,struct Mystruct **pend, int adddata); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; circulate_add(&phead,&pend,4,5); ...... return 0; } void circulate_add(struct Mystruct **phead,struct Mystruct **pend, int count, int adddata); { for(int i = 0;i<count;i++) { endadd(phead, pend, adddata); } }
핵심은 다음을 통해 하나씩 아래로 내려가는 것입니다. 지정된 노드의 데이터가 발견된 데이터와 일치하는지 확인하기 위해 헤드 포인터를 사용합니다. 가장 중요한 것은 중간 변수를 사용하여 헤드 포인터를 기록하는 것입니다. 그렇지 않으면 헤드 포인터를 찾을 수 없습니다(단일 체인이기 때문). 목록):
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void data_find(struct Mystruct *phead, int designated_data); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; middle_data_find(phead,4); ...... return 0; } void data_find(struct Mystruct* phead, int designated_data) { if (NULL == phead) return; struct Mystruct* ptemp = phead; while (ptemp != NULL) { if (ptemp->data == designated_data) { printf("找到了"); break; } ptemp = ptemp->pnext; } return; }
아이디어는 기본적으로 동일합니다. 차이점은 지정된 아래 첨자가 전달된다는 것입니다. 내부 아래 첨자와 카운터 값이 동일한 경우 카운터를 정의합니다. 이 노드는 연결 목록에 존재합니다. 이를 보내거나 상기시켜 주고 생각해볼 수 있습니다.
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; struct Mystruct *index_find(struct Mystruct *phead, int index); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; middle_data_find(phead,4); ...... return 0; } struct Mystruct* index_find(struct Mystruct* phead, int index) { if (NULL == phead||index<0) return NULL; struct Mystruct* ptemp = phead; int i = 0; for (i = 0; i < index; i++) { ptemp = ptemp->pnext; } return ptemp; }
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void deleat_head(struct Mystruct **phead,struct Mystruct **pend); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; deleat_head(&phead) ...... return 0; } void deleat_head(struct Mystruct** phead, struct Mystruct** pend) { if (NULL == *phead) return; struct Mystruct* pt = *phead; if ((*phead)->pnext == NULL) { free(pt); *phead = NULL; *pend = NULL; } else { *phead = (*phead)->pnext; free(pt); } } void deleat_end(struct My
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void deleat_end(struct Mystruct**phead,struct Mystruct**pend); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; deleat_head(&phead) ...... return 0; } void deleat_end(struct Mystruct** phead, struct Mystruct** pend) { if (NULL == *phead) return; struct Mystruct* pt = *phead; if (pt->pnext == NULL) { free(pt); *phead = NULL; *pend = NULL; } else { while (pt->pnext != (*pend)) { if (pt->pnext == (*pend)) { free(*pend); *pend = pt; pt->pnext = NULL; pt = pt->pnext; } } } }
여기서 아이디어 변경: 데이터 또는 첨자를 기반으로 이전 노드를 찾고, pnext 포인터의 포인팅을 변경합니다. 다음 노드는 이 노드의 pnext로 중간에 지정된 데이터를 삭제하는 간단한 데모입니다.
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void deleat_middlledata(struct Mystruct**phead,struct Mystruct**pend,int deleatdata); int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; deleat_head(&phead) ...... return 0; } void deleat_middlledata(struct Mystruct**phead,struct Mystruct**pend,int deleatdata) { if (NULL == *phead) return; struct Mystruct* pt = *phead; if (pt->pnext == NULL) { free(pt); *phead = NULL; *pend = NULL; } }
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Mystruct { int data; struct Mystruct *pnext; }; void deleat_all(struct Mystruct** phead, struct Mystruct** pend) int main(void) { struct Mystruct *phead = NULL; struct Mystruct *pend= NULL; deleat_all(&phead,&pend) ...... return 0; } void deleat_all(struct Mystruct** phead, struct Mystruct** pend) { while (*phead!= NULL) { struct Mystruct* pt = *phead; *phead = (*phead)->pnext; free(pt); } *phead = NULL; *pend = NULL; }
위 내용은 Java 단방향 연결 목록의 작업은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!