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 언어 링크 에 대한 상세 한 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 체인 시계는 뱀을 탐식하는 작은 게임을 실현한다본고의 실례는 여러분에게 C 언어 체인표가 뱀 탐식 게임을 실현하는 구체적인 코드를 공유하여 참고하도록 하였으며, 구체적인 내용은 다음과 같다. 프로젝트 이름: 뱀놀이 운영 환경: Linux 프로그래밍 언어: C 언...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.