c 언어 구현 단 방향 순환 링크
/ / 마지막 노드 의 후계 지향 헤드 는 단일 순환 링크 를 구성 합 니 다.
/ / 앞장 서지 않 는 노드 판 공: head = = NULL / / 앞장 서 는 노드 판 공: head->next == head; 빈 / / 와 단일 링크 코드 의 차이 점: 매번 순환 하 는 점프 조건 이 바 뀌 고 꼬리 삽입 이 바 뀝 니 다. //프로그램 에 노드 를 삽입 하 는 것 이 헤드 노드 라면 꼬리 노드 의 방향 을 업데이트 해 야 합 니 다.
/ / 머리 노드 를 삭제 하고 꼬리 노드 의 방향 을 업데이트 하 며 꼬리 노드 를 삭제 하고 이전 노드 의 방향 을 업데이트 합 니 다.
독 자 는 자신 이 단일 체인 표 에서 순환 체인 표 까지 수 동 으로 한 번 실현 하 는 것 을 권장 합 니 다. 순환 체인 표 의 이 치 는 매우 간단 합 니 다.
그러나 그 중의 많은 세부 사항, 특히 삽입, 삭제, 그리고 머리 결점, 꼬리 노드 의 처리 등 눈 에 띄 지 않 는 문제 가 존재 하 는 지, 아니면 한 번 두 드 리 는 것 이 진실 입 니까?
단 방향 순환 링크 는 단일 체인 표 중의 일부 기능 을 선택 하여 실현 했다. 독자 도 이들 을 비교 해 보면 단일 체인 표 의 각종 기능 의 실현 을 볼 수 있다.http://blog.csdn.net/hkhl_235/article/details/78196865
주요 기능:
#include
#include
#include
#include // sleep , (linux)windows #include Sleep(2000);
typedef struct node
{
int no;
int age;
char sex[5];
char name[20];
struct node *next;
}Node;
void Print(Node *head); //
void CreateNode(Node *head, Node **p, int no, int age, char *sex, char *name);//
void Add(Node **head, int no, int age, char *sex, char *name); //
Node *FindNode(Node *head, int no); // , NULL
Node *PrvNode(Node *head, Node *find); //
void SerchNode(Node *head, int no); //
void Insert(Node **head); //
void HeadInsert(Node **head, int sid); // ( )
void BackInsert(Node **head, int sid); // ( )
void DeleteNode(Node **head, int no); // no
void FreeAll(Node **head); //
int GetToatalNode(Node *head); //
함수 구현 부분:
void Print(Node *head)
{
Node *first = head;
if(head != NULL)
{
printf("
");
while(head != NULL)
{
printf("%d %d %s %s %p
", head->no, head->age, head->sex, head->name, head->next);
head = head->next;
if(head == first)
{
//sleep(2); // break
break ;
}
}
}
else
{
printf("
");
}
}
void CreateNode(Node *head, Node **p, int no, int age, char *sex, char *name)
{
*p = (Node *)malloc(sizeof(Node));
if(*p != NULL)
{
(*p)->no = no;
(*p)->age = age;
strcpy((*p)->sex, sex);
strcpy((*p)->name, name);
(*p)->next = head;
}
else
{
printf("
");
}
}
// ,, ...
void Add(Node **head, int no, int age, char *sex, char *name)
{
Node *h = *head;
Node *p;
if(*head == NULL)
{
CreateNode(*head, &p, no, age, sex, name);
*head = p; // ,
p->next = *head; // , CreareNode p p->next head , head NULL, . A
}
else
{
CreateNode(*head, &p, no, age, sex, name);
while(h->next != *head) //while (*->next)
{
h = h->next; //A, head NULL,
}
h->next = p;
}
}
//
// NULL
Node *FindNode(Node *head, int no)
{
int flag = 0;
Node *first = head;
while(head)
{
if(head->no == no)
{
flag = 1;
break;
}
head = head->next;
if(head == first)
{
break;
}
}
if(flag == 0)
{
return NULL;
}
return head;
}
//
Node *PrvNode(Node *head, Node *find)
{
Node *first = head;
while(head)
{
if(find == head) //
{
break;
}
if(head->next == find)
{
break;
}
head = head->next;
if(head == first)
{
break;
}
}
return head;
}
//
void Insert(Node **head)
{
Node *first = *head;
printf(" :
");
int no;
float age;
char sex[5];
char name[10];
scanf("%d%f%s%s", &no, &age, sex, name);
Node *q;
CreateNode(*head, &q, no, age, sex, name);
Node *p1 = *head;
Node *p2;
int flag = 0;
while(p1->no <= no) // NULL
{
p2 = p1;
p1 = p1->next;
if(p1 == *head)
{
flag = 1;
break;
}
}
if(p1 == *head && flag != 1) //
{
q->next = p1;
*(head) = q;
//
for(; p1->next != first; p1 = p1->next);
p1->next = *head;
}
else if(p1 == *head && flag == 1) //
{
p2->next = q;
q->next = *head;
}
else //
{
q->next = p2->next;
p2->next = q;
}
}
void HeadInsert(Node **head, int sid) // ( )
{
Node *first = *head;
printf(" :
");
int no;
float age;
char sex[5];
char name[10];
scanf("%d%f%s%s", &no, &age, sex, name);
Node *q;
CreateNode(*head, &q, no, age, sex, name);
Node *p1 = FindNode(*head, sid);
Node *p2 = PrvNode(*head, p1);
if(p1 == *head) //
{
q->next = p1;
*(head) = q;
//
for(; p1->next != first; p1 = p1->next);
p1->next = *head;
}
else //
{
q->next = p2->next;
p2->next = q;
}
}
void BackInsert(Node **head, int sid) // ( )
{
printf(" :
");
int no;
float age;
char sex[5];
char name[10];
scanf("%d%f%s%s", &no, &age, sex, name);
Node *q;
CreateNode(*head, &q, no, age, sex, name);
Node *p1 = FindNode(*head, sid);
Node *p2 = p1->next;
if(p1->next == *head) //
{
p1->next = q;
q->next = *head;
}
else //
{
q->next = p1->next;
p1->next = q;
}
}
// no
void DeleteNode(Node **head, int no)
{
Node *first = *head;
Node *p1, *p2;
p1 = p2 = NULL;
p1 = *head;
while(p1) //
{
if(p1->no == no)
{
break;
// , p1 , p1 NULL
//
}
p2 = p1;
p1 = p1->next;
if(p1 == *head)
{
break;
}
}
if(p1 == *head) //
{
(*head) = p1->next; //
//
Node *p = p1;
for(; p->next != first; p = p->next);
p->next = *head;
free(p1); //
}
else //
{
p2->next = p1->next;
free(p1);
}
}
void SerchNode(Node *head, int no) //
{
Node *sr = FindNode(head, no);
if(sr != NULL)
{
printf("%d %d %s %s %p
", sr->no, sr->age, sr->sex, sr->name, sr->next);
}
else
{
printf("
");
}
}
//
//
void FreeAll(Node **head)
{
Node *p1 = *head;
Node *p2 = NULL;
Node *q = NULL;
while(p1->next == *head)
{
p2 = p1->next;
p1->next = p2->next;
free(p2);
}
free(*head);
*head = NULL;
}
int GetToatalNode(Node *head) //
{
int num = 0;
Node *first = head;
if(head != NULL)
{
while(head != NULL)
{
num++;
head = head->next;
if(head == first)
{
break;
}
}
}
return num;
}
다음은 테스트 코드:
int main()
{
Node *head = NULL;
Add(&head, 1002, 17, " ", " 2");
Add(&head, 1001, 15, " ", " 1");
Add(&head, 1003, 12, " ", " 3");
Add(&head, 1004, 21, " ", " 4");
Add(&head, 1005, 22, " ", " 5");
Print(head);
printf(" 1005 :
");
DeleteNode(&head, 1002);
Print(head);
printf("
: %d
", GetToatalNode(head));
printf(" ( ):
");
printf("( ) , , , :
");
HeadInsert(&head, 1002);
Print(head);
printf("( ) , , , :
");
BackInsert(&head, 1004);
Print(head);
printf(" ( ):
");
printf(" , , , :");
Insert(&head);
Print(head);
printf(" :
");
FreeAll(&head);
Print(head);
return 0;
}
문제 가 있 으 면 지적 을 환영 합 니 다. 공동 발전!
단일 체인 표 의 각종 기능 의 실현:http://blog.csdn.net/hkhl_235/article/details/78196865
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
c 언어 간단한 파일 r/w 조작 방법데이터의 입력과 출력은 거의 모든 C 언어 프로그램과 수반된다. 입력이란 원본에서 데이터를 얻는 것이다. 출력은 단말기에 데이터를 쓰는 것으로 이해할 수 있다.이곳의 원본은 키보드, 마우스, 하드디스크, 시디, 스캐...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.