동적 체인 테이블의 삭제 수정, 인쇄 삭제 등 기본 조작 및 코드 모듈화(완전 C 언어 코드!)
연쇄표 기초 지식
1. 메모리 그림으로 전개(1) 체인 테이블에'헤드 포인터'변수가 있는데'헤드 포인터'를 제공하지 않으면 전체 체인 테이블에 접근할 수 없다.(2) 체인 테이블의 모든 요소는'결점'이 되고 모든 결점은 데이터와 다음 결점의 주소를 포함한다.끝의 결점 주소 부분은 NULL(빈 주소)입니다.(3) 체인 테이블의 원소가 메모리에 있는 주소는 연속되지 않을 수 있다.
2. 체인 테이블의 구축(1) 정적 체인 테이블: 모든 결점은 프로그램에서 정의된 것으로 임시로 개척된 것이 아니며 다 사용한 후에 방출할 수 없다.(2) 동적 체인 테이블: 프로그램 실행 과정에서 무에서 유로 하나의 체인 테이블을 구축한다. 즉, 하나하나 결점을 개척하고 각 결점 데이터를 입력하며 전후 체인의 관계를 구축한다.
3. 체인 시계의 기본 조작이 이 코드를 쓸 때 중간에 하나의while가if라고 썼기 때문에 정말 마지막 테스트가 계속 틀렸어요. 정말 취했어요!!!온전한 코드를 동봉합니다.틀린 점은 바로잡아 주세요~ 테스트해 보면 틀림없습니다.
#include <stdio.h>
#include <stdlib.h>
typedef int Datatype; //
typedef struct node {
Datatype data;
struct node *next;
}Node;
//
Node* creatNode(Datatype data) {
Node* p = NULL;
p = (Node*)malloc(sizeof(Datatype)); //
if (p == NULL) { //
return NULL;
}
p->data = data; //
p->next = NULL;
return p;
}
//
void printList(Node* head) {
Node* p = head;
if (head == NULL) {
return;
}
while(p != NULL) {
printf("%d
",p->data);
p = p->next;
}
return;
}
//
int insertNodeBehind(Node* p,Node* pnew) {
if (p == NULL || pnew == NULL) {
return -1;
}
if (p->next != NULL) {
pnew->next = p->next;
p->next = pnew;
}
else {
p->next = pnew;
}
/*
pnew->next = p->next;
p->next = pnew;
, p->next = NULL pnew->next = NULL*/
return 0;
}
//
int insertDataBehind(Node *p,Datatype data) { Node* pnew = NULL; if (p == NULL) { return -1; }
pnew = creatNode(data);
insertNodeBehind(p,pnew);
return 0;
}
//
Node* findListTail(Node* phead) {
if (phead == NULL) {
return NULL;
}
while (phead->next != NULL) {
phead = phead->next;
}
return phead;
}
// ,** ,
int listInsertDataAtTail(Node** phead,Datatype data) {
Node *p = NULL;
if (phead == NULL) {
return -1;
}
if (*phead == NULL) {
*phead = creatNode(data);
return 0;
}
p = findListTail(*phead);
insertDataBehind(p,data);
return 0;
}
//
int deleteNodeBehind(Node* p) {
Node* temp = NULL;
if (p == NULL) {
return -1;
}
if (p->next == NULL) {
return 1;
}
temp = p->next;
p->next = p->next->next;
free(temp);
return 0;
}
// data
Node* findNode(Node* head,Datatype data) {
Node* p = NULL;
if (head == NULL) {
return NULL;
}
p = head;
while (p->data != data) {
if (p->next != NULL) {
p = p->next;
}
else {
return NULL; // data
}
}
return p;
}
//
int listChangeData(Node* head,Datatype oldData,Datatype newData) {
Node* p = NULL;
if (head == NULL) {
return -1;
}
p = findNode(head, oldData);
p->data = newData;
return 0;
}
// data
Node* findPrevNode(Node *head,Datatype data) {
Node* p = NULL;
if (head == NULL) {
return NULL;
}
p = head;
while (p->next != NULL) {
if (p->next->data == data) {
return p;
}
else {
p = p->next;
}
}
return NULL;
}
// data
int listDeleteData(Node** phead,Datatype data) { Node* p = NULL; Node* temp = NULL; if (phead == NULL || *phead == NULL) { return -1; }
if ((*phead)->data == data) { temp = (*phead); (*phead) = (*phead)->next; free(temp); return 0; }
p = findPrevNode(*phead, data);
deleteNodeBehind(p);
free(temp);
return 0;
}
//
int listDestroy(Node **phead) {
if (phead == NULL || (*phead) == NULL) {
return 0;
}
while ((*phead)->next != NULL) { deleteNodeBehind(*phead); } (*phead) = NULL; free(*phead); // ! return 0; }
int main(int argc, const char * argv[]) {
// , ,
Node* p = NULL;
listInsertDataAtTail(&p, 1); // creatNode,findListTail,insertNodeBehind
printList(p);
listInsertDataAtTail(&p, 2);
listInsertDataAtTail(&p, 3);
listInsertDataAtTail(&p, 4);
listInsertDataAtTail(&p, 5);
printf(" :1-2-3-4-5
");
printList(p);
//
// printf(" 1
");
// listDeleteData(&p, 1);
// listDeleteData(&p, 3);
// printList(p);
//
printf(" 2 20000
");
listChangeData(p, 2, 20000);
printList(p);
listDestroy(&p);
printList(p);
return 0;
}
output:
1
:1-2-3-4-5
1
2
3
4
5
2 20000
1
20000
3
4
5
드디어 됐어~ 쉬었어, 쉬었어~ 잘자~ 구경꾼은 많지 않지만 천천히 써볼게, 요즘은 이렇게 써보니까 수확이 많네. 아무래도 다른 사람한테 보여줘야 돼. (아무도 없지만ㅋㅋㅋㅋㅋ) 지식도 좀 빠뜨렸어~ 계속 화이팅!사람이 생기면 의견을 많이 내주세요 여러분 소~ 감사합니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
하나의 단일 체인 테이블의 순환과 귀속 실현을 반전시키다텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.