C 언어 링크 상세 해석 및 코드 분석

링크
링크 는 흔히 볼 수 있 는 중요 한 데이터 구조 이다.그것 은 동적 으로 저장 분 배 를 하 는 구조 이다.링크 와 배열 을 비교 할 때 저장 공간 을 미리 정 하지 않 고 필요 에 따라 메모리 셀 을 엽 니 다.
아래 그림 1 은 가장 간단 한 링크(단 방향 링크)의 구조 이다.
图一
0 번 째 결점 을 두 결점 이 라 고 하 는데 첫 번 째 결점 이 있 는 첫 번 째 주 소 를 저장 합 니 다.데이터 가 없고 포인터 변수 일 뿐 입 니 다.아래 의 모든 노드 는 두 개의 도 메 인 으로 나 뉘 는데 하 나 는 데이터 도 메 인 이 고 각종 실제 데 이 터 를 저장 합 니 다.예 를 들 어 학 번 num,이름 name,성별 sex 와 성적 score 등 입 니 다.다른 도 메 인 은 포인터 필드 로 다음 노드 의 첫 주 소 를 저장 합 니 다.체인 테이블 의 모든 결점 은 같은 구조 유형 이다.
환경 구축
사용 하 는 Visual Studio 2019 소프트웨어
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
원본 파일 에 C 파일 추가
在这里插入图片描述
정적 링크 만 들 기
필요 한 헤더 파일 포함

#include<stdio.h> //         
#include<stdlib.h>//   C、C++           
매크로 정의 관련 변수

#define LEN sizeof(struct Student)//          
#define TYPE struct Student//          
구조 체 만 들 기

struct Student//           ,    ,  
{
	long num;
	float score;
	struct Student* next;//next     ,       
};
//                      ,              
주 함수

int main()
{
	TYPE* head,*p;//     
	struct Student a,b,c;//         
	a.num = 101; a.score = 20;//         
	b.num = 102; b.score = 20;
	c.num = 103; c.score = 20;
	/*1、A.B A        
      2、A->B A   ,->     ,A->B   A    B,A      、  、     ;*/
	head = &a;
	a.next = &b;
	b.next = &c;
	c.next = NULL;
	p = head;//       
	do
	{
		printf("%ld %5.1f
",p->num,p->score);// p = p->next;// P } while (p != NULL);// return 0; }
결과 전시
在这里插入图片描述
설명 하 다.
첫 번 째 노드 의 시작 주 소 를 헤드 포인터 head 에 할당 하고 두 번 째 노드 의 시작 주 소 를 첫 번 째 노드 의 next 구성원 에 게 할당 하 며 두 번 째 노드 의 시작 주 소 를 첫 번 째 노드 의 next...세 번 째 노드 의 next 대 가 를 NULL 로 부여 하여 간단 한 링크 를 만 들 었 습 니 다.
동적 링크 만 들 기
동적 링크 구축 이란 프로그램 수행 과정 에서 무 에서 유 를 창조 하 는 링크 를 말한다.즉,하나의 노드 를 개척 하고 각 노드 데 이 터 를 입력 하 며 앞 뒤 가 연 결 된 관 계 를 구축한다.
필요 한 헤더 파일 포함

#include<stdio.h> //         
#include<stdlib.h>//   C、C++           
#include<malloc.h>//           
매크로 정의 관련 변수

#define LEN sizeof(struct Student)//          
#define TYPE struct Student//          
구조 체 만 들 기

struct Student//           ,    ,  
{
	long num;
	float score;
	struct Student* next;//next     ,       
};
//                      ,              
링크 함수 만 들 기

TYPE* Creat(void)//    ,               
{
	TYPE* head;//     
	TYPE* p1,*p2;//               
	number = 0;//   ,    
	p1 = p2 = (TYPE*)malloc(LEN);//      
	printf("          ,  
");// printf(" 101,1 0,0
"); scanf("%ld,%f", &p1->num, &p1->score);// head = NULL;// while (p1->num!=0)// 0, { number++;// if (number == 1)// , head = p1; else p2->next = p1;// 1 , next p2 = p1;// p1 = (TYPE*)malloc(LEN);// scanf("%ld,%f", &p1->num, &p1->score);// } p2->next = NULL;// , return (head);// }
주 함수

int main()
{
	TYPE* pt;//           
	pt = Creat();//              
	printf("
num:%ld
score:%5.lf
", pt->num,pt->score);// return 0; }
결과 전시
在这里插入图片描述
==글 에서 마지막 결 과 는 첫 번 째 노드 의 내용 을 보 여 주 었 습 니 다.강력 한 기능 을 가 진 링크 로 서 그의 조작 은 당연히 많 습 니 다.예 를 들 어 링크 의 생 성,수정,삭제,삽입,출력,정렬,역순,링크 의 요 소 를 비우 고 링크 의 길 이 를 구 하 는 등 입 니 다.==
링크 출력
순환 으로 링크 를 직접 출력 할 수 있 습 니 다.
출력 함수

void print(TYPE * head)
{
	TYPE * p;//    
	printf("
NOW These %d records are:
");// p = head;// p if(head!=NULL)// do { printf("%ld %5.1f
",p->num,p->score); p = p->next;// } while (p != NULL); }
주 함수

int main()
{
	TYPE * pt;//           
	pt = Creat();//              
	print(pt);//    
	return 0;
}
링크 수정
수정 함수
링크 노드 값 을 수정 하 는 것 은 매우 간단 하 다.다음은 링크 와 수정 할 노드 를 입력 하여 값 을 수정 하 는 함수 입 니 다.

void change(TYPE* head, int n) //            
{
	TYPE* p = head;//     
	int i = 0;
	while (i < n && p != NULL) {
		p = p->next;
		i++;
	}//         
	if (p != NULL) {
		printf("       
"); scanf("%ld,%f", &p->num, &p->score);// } else printf("
"); }
주 함수

int main()
{
	TYPE* pt;//           
	pt = Creat();//              
	change(pt,2);//         ,     2+1 
	print(pt);//    
	return 0;
}
\#\#링크 삭제
링크 를 삭제 하 는 요 소 는 바로 앞 노드 의 포인터 도 메 인 을 삭제 할 노드 를 넘 어 다음 노드 를 가리 키 는 것 입 니 다.즉:p->next=q->next;그리고 q 노드 의 공간,즉 free(q)를 방출 합 니 다.
在这里插入图片描述
함수 삭제

void delet(TYPE* head, int n) {
	TYPE* p = head, * in;//      
	int i = 0;
	while (i < n && p != NULL) {
		in = p;//     
		p = p->next;//     
		i++;
	}
	if (p != NULL) {
		in->next = p->next;//     
		free(p);//      
	}
	else {
		printf("     
"); } }
주 함수

int main()
{
	TYPE* pt;//           
	pt = Creat();//              
	delet(pt,1);//   1+1   
	print(pt);//    
	return 0;
}
출력 결과
在这里插入图片描述
\#\#링크 삽입
우 리 는 노드 를 삽입 하 는 것 이 바로 전 노드 를 삽입 하 는 포인터 도 메 인 링크 로 노드 의 데이터 도 메 인 을 삽입 한 다음 에 노드 를 삽입 하 는 포인터 도 메 인 링크 에 후 노드 의 데이터 도 메 인 을 삽입 하 는 것 임 을 알 수 있다.그림 에 따라 노드 를 삽입 하면 e->next=head->next 이다.head->next = e;
링크 노드 를 늘 리 려 면 두 개의 구조 체 포인터 와 int 데 이 터 를 사용 합 니 다.
在这里插入图片描述
삽입 함수

void insert(TYPE* head, int n) {//     
	TYPE* p = head, * in;
	int i = 0;
	while (i < n && p != NULL) {
		p = p->next;
		i++;//      
	}
	if (p != NULL) {
		in = (TYPE*)malloc(sizeof(TYPE));//      
		printf("       
"); scanf("%ld,%f", &in->num, &in->score);// in->next = p->next;// in , in p p->next = in;// p , p in } else { printf("
"); } }
주 함수

int main()
{
	TYPE* pt;//           
	pt = Creat();//              
	insert(pt, 1);// 1+1   
	print(pt);//    
	return 0;
}
결과 표시
在这里插入图片描述
발생 한 문제
1.scanf 와 printf 가 VS 2019 에서 사용 할 때 오류 가 발생 할 수 있 습 니 다.해결 방법 은 다음 과 같 습 니 다.
在这里插入图片描述
在这里插入图片描述
마지막 으로 테스트 의 모든 원본 프로그램 입 니 다.
여기 서 C 언어 링크 에 대한 상세 한 설명 과 코드 분석 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C 언어 링크 에 대한 상세 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!

좋은 웹페이지 즐겨찾기