길림대학 초성 고급 언어 프로그램 설계 실험 09 동적 데이터 조직

98305 단어 필기c 언어
빈칸을 채우는 문제는 어렵지 않고 게으르기 때문에 프로그램에 직접 맞추어 작성하고 참고를 합니다. 모두 함께 교류하는 것을 환영합니다. -) 1문제 번호: Exp09-Basic01
제목: 단일 체인 테이블 만들기
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
키보드에서 무작위로 0으로 끝나는 약간의 비영정수를 입력하여 단일 체인 테이블을 만듭니다.이후 이 체인 테이블에 저장된 숫자를 순서대로 출력하고 인접한 숫자 사이에는 서양어 공백으로 간격을 두고 마지막 숫자 뒤에는 아무런 문자도 없다.빈 체인 테이블의 경우 NULL을 내보냅니다.
예를 들어,
입력: 5 4 2 1 3 0
출력: 5 4 2 1 3
입력: 0 5 4 2 1 3 0
출력:NULL
#include
#include
struct  cell{
     
	int x;
	struct cell *next; 
};
struct cell *build(void){
     
	struct cell *head,*tmp,*p;
	head=tmp=p=NULL;
	int n;
	head=(struct cell*)malloc(sizeof(struct cell));
	scanf("%d",&head->x);
	tmp=head;
	tmp->next=NULL;
	if(head->x==0)head=NULL;
	else{
     
	do{
     
		p=(struct cell*)malloc(sizeof(struct cell));
		scanf("%d",&p->x);
		tmp->next=p;
		tmp=p;
		tmp->next=NULL;
	}while(p->x!=0);
}
	return head;
}
void print(struct cell *head){
     
	struct cell *p;
	printf("%d",head->x);
	p=head->next;
	while(p->x!=0){
     
		printf(" %d",p->x);
		p=p->next;
	}
}
void release(struct cell*head){
     
	struct cell *p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
 struct cell* head;
 head = build();
 if(head!=NULL)
        print(head);
    else
        printf("NULL");
 release(head);
}

2번 제목 번호: Exp09-Basic02, GJBook3-13-06
제목: 단일 체인 테이블 중복 결점 삭제
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
먼저 키보드에 따라 무작위로 입력하고 0으로 끝나는 약간의 비영정수로 단사슬표를 만든다.그리고 이 체인 테이블에서 중복된 결점을 삭제하고 하나만 보존하며 원래의 결점 순서를 바꾸지 않습니다.마지막으로 삭제된 체인 테이블의 각 결점 값을 출력하고 인접한 숫자 사이에는 서양어 공백으로 간격을 두고 마지막 숫자 뒤에는 아무런 문자도 없다.빈 체인 테이블의 경우 NULL을 내보냅니다.
예를 들어,
입력: 5 4 2 1 3 0 출력: 5 4 2 1 3
입력: 4 2 1 3 2 0 출력: 4 2 1 3
입력: 0 4 2 3 2 0 출력: NULL
#include
#include
struct  cell{
     
	int x;
	struct cell *next; 
};
struct cell *build(void){
     
	struct cell *head,*tmp,*p;
	head=tmp=p=NULL;
	int n;
	head=(struct cell*)malloc(sizeof(struct cell));
	scanf("%d",&head->x);
	tmp=head;
	tmp->next=NULL;
	if(head->x==0)head=NULL;
	else{
     
	do{
     
		p=(struct cell*)malloc(sizeof(struct cell));
		scanf("%d",&p->x);
		tmp->next=p;
		tmp=p;
		tmp->next=NULL;
	}while(p->x!=0);
}
	return head;
}
struct cell* del2one(struct cell* head){
     
	struct cell *p,*q,*r;
	p=head;
	while(p!=NULL){
     
		q=p;
		while(q->next!=NULL){
     
			if(q->next->x==p->x){
     
				r=q->next;
				q->next=r->next;
			}
			else{
     
				q=q->next;
			}
		}
		p=p->next;
	}
	return head;
} 
void print(struct cell *head){
     
	struct cell *p;
	printf("%d",head->x);
	p=head->next;
	while(p->x!=0){
     
		printf(" %d",p->x);
		p=p->next;
	}
}
void release(struct cell*head){
     
	struct cell *p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
struct cell* head;
head = build();
head=del2one(head);
if(head!=NULL)
       print(head);
   else
       printf("NULL");
release(head);
}

여기에서 나는 다른 사람의 코드를 보았는데, 상황이 더욱 복잡하다.https://blog.csdn.net/tao_627/article/details/88687243?utm_source=app3 제목 번호: Exp09-Basic03
제목: 단일 체인 테이블 중간 결점 구하기
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
먼저 키보드에 따라 무작위로 입력하고 0으로 끝나는 약간의 비영정수로 단사슬표를 만든다.
그리고 체인표의 중간 위치에 있는 결점을 찾고 중간 결점이 두 개 있으면 앞의 것을 중간 위치 결점으로 설정한다.
마지막으로 중간 결점부터 체인 테이블 끝까지의 각 결점 값을 출력합니다. 인접한 숫자 사이에는 서양어 공백으로 간격을 두고 마지막 숫자 뒤에는 아무런 문자도 없습니다.
빈 체인 테이블의 경우 NULL을 내보냅니다.
예를 들어,
입력: 5 4 2 1 3 0
출력: 2 1 3
입력: 4 2 1 3 2 0
출력: 1 3 3 2
#include
#include
struct  cell{
     
	int x;
	struct cell *next; 
};
struct cell *build(void){
     
	struct cell *head,*tmp,*p;
	head=tmp=p=NULL;
	int n;
	head=(struct cell*)malloc(sizeof(struct cell));
	scanf("%d",&head->x);
	tmp=head;
	tmp->next=NULL;
	if(head->x==0)head=NULL;
	else{
     
	do{
     
		p=(struct cell*)malloc(sizeof(struct cell));
		scanf("%d",&p->x);
		tmp->next=p;
		tmp=p;
		tmp->next=NULL;
	}while(p->x!=0);
}
	return head;
}
struct cell* mid(struct cell *head){
     
	struct cell *p0,*p;
	int n=0,i,j=0;
	if(head==NULL)head==NULL;
	else{
     
	p=head;
	while(p!=NULL){
     
		p=p->next;
		n=n+1;
	}
	j=n/2;
	p0=head;
	while(j!=1){
     
		p0=p0->next;
		j--; 
	}
	head=p0;
}
	return head;
}
void print(struct cell *head){
     
	struct cell *p;
	printf("%d",head->x);
	p=head->next;
	while(p->x!=0){
     
		printf(" %d",p->x);
		p=p->next;
	}
}
void release(struct cell*head){
     
	struct cell *p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
 struct cell* head,*half;
 head = build();
 half = mid(head);
 if(half!=NULL)
        print(half);
    else
        printf("NULL");
 release(head);
}

4번 제목 번호: Exp09-Basic04
제목: 싱글 체인 테이블 교환 두 결점
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
먼저 키보드에 따라 무작위로 입력하고 0으로 끝나는 약간의 비영정수로 단사슬표를 만든다.
그리고 입력한 두 개의 인덱스 위치에 따라 체인 테이블의 두 결점을 교환한다(체인 테이블의 첫 번째 요소 인덱스는 1이고 교환할 두 개의 인덱스 위치는 서로 인접하지 않는다).
마지막 체인 테이블의 각 결점 값을 출력하고, 인접한 숫자 사이에는 서양어 공백으로 간격을 두고, 마지막 숫자 뒤에는 아무런 문자도 없다.
빈 체인 테이블의 경우 NULL을 내보냅니다.
예를 들어,
입력: 1 2 3 4 5 6 0 1 5
출력: 5 2 3 4 1 6
입력: 0 1 2 3 4 5 6 0 1 5
출력:NULL
#include 
#include 
struct cell {
     //          
 int x;
 struct cell* next;
};
struct cell* build(void) {
     //     ,               
 struct cell* head, * tmp, * p;
 head = tmp = p = NULL;
 int n;
 head=(struct cell*)malloc(sizeof(struct cell));
 scanf("%d",&head->x);
 tmp=head;
 tmp->next=NULL;
 if(head->x==0)head=NULL;
 else{
     
 	do{
     
 		p=(struct cell*)malloc(sizeof(struct cell));
 		scanf("%d",&p->x);
 		if(p->x==0)break;
 		tmp->next=p;
 		tmp=p;
 		tmp->next=NULL;
	 }while(p->x!=0);
 }
 return head;//      
}
struct cell* swap(struct cell* head,int m,int n) {
     //     m n     ,head         
 if(head==NULL) return NULL;
    struct cell* pm=head, * pn=head;
 struct cell* pm0 = NULL, * pn0 = NULL;
 struct cell* tmp;
 int i;
 for (i = 1;i < m && pm != NULL;i++) {
      
  pm0 = pm;
  pm = pm->next;
 }
 for (i = 1;i < n && pn != NULL;i++) {
     
  pn0 = pn;
  pn = pn->next;
 }
 if (pm != NULL && pn != NULL && m != n) {
     //   m,n         
      
  if (pm0 != NULL && pn0 != NULL) {
     
  	tmp=pm->next;
  	pm->next=pn->next;
	pn->next=tmp;
	pm0->next=pn;
	pn0->next=pm;
	pm=pm0->next;
	pn=pn0->next; 
  }
  if (pm0 == NULL && pn0 != NULL) {
     
  	head=pn;
  	tmp=pn->next;
  	pn->next=pm->next;
  	pn0->next=pm;
  	pm->next=tmp;
  }
  if (pm0 != NULL && pn0 == NULL) {
     
  	head=pm;
  	tmp=pm->next;
  	pm->next=pn->next;
  	pm0->next=pn;
  	pn->next=tmp;
  }
 }
 return head;
}
void print(struct cell* head) {
     //       ,head         
      struct cell *p;
      printf("%d",head->x);
      p=head->next;
      while(p!=NULL){
     
      	printf(" %d",p->x);
      	p=p->next;
	  }
}
void release(struct cell* head) {
     //       ,head         
      struct cell *p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
 struct cell* head;
 int m, n;
 head = build();
 scanf("%d%d", &m, &n);
 head = swap(head,m,n);
 if(head!=NULL)
        print(head);
    else
        printf("NULL");
 release(head);
}


5번 제목 번호: Exp09-Basic05, GJBook 3번 - 13-04
제목: 단일 체인 메모리 법뢰 시퀀스
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
정정수 n을 정하고 단사슬표로 n 단계 법뢰 서열의 각 값을 점차적으로 저장한다.n 단계 법뢰 서열은 모든 약속할 수 없는 점수 j/i(0
양의 정수 n 입력하기;n 단계 법뢰 서열의 각 분수 형식을 출력하고 분수의 분자와 분모는/연결하며 각 분수는 서양어 빈칸으로 간격을 두고 마지막 숫자는 아무런 문자도 없습니다.만약 빈 체인 테이블이나 n이 요구에 부합되지 않으면 NULL을 출력합니다.
예를 들어,
입력
출력: 0/1 1/3 1/2 2/3 1/1
#include 
#include 
struct  farlei_item {
     
 int   numerator, denominator;   //   、  
 struct  farlei_item* next;   //     
};
typedef  struct  farlei_item* farleipointer;
int  gcd(int x, int y) {
         /*         */
    if(y==0)return x;
	else return gcd(y,x%y); 
}
/*      ,        */
farleipointer farlei(int n) {
     
 int i, j;
 farleipointer fn, r, r0, p;
 fn = r = r0 = p = NULL;
 if (n < 1)return NULL; //  n<=0,       
 fn = (farleipointer)malloc(sizeof(struct farlei_item));  //  0/1
 fn->numerator = 0;
 fn->denominator = 1;
 p = (farleipointer)malloc(sizeof(struct farlei_item));   //  1/1
 p->numerator = 1;
 p->denominator = 1;
 fn->next = p;
 p->next = NULL;
 for(i=2;i<=n;i++){
     
 	for(j=1;j<i;j++){
     
 		if(gcd(i,j)==1){
     
 			r=fn;
 			while(j*(r->denominator)>i*(r->numerator)){
     
 				r0=r;
 				r=r->next;
			 }
			 p=(farleipointer)malloc(sizeof(struct farlei_item));
			 p->numerator=j;
			 p->denominator=i;
			 p->next=r;
			 r0->next=p;
		 }
	 }
 } 
 return fn;
}
void print(farleipointer fn) {
     //  fn       
     farleipointer p;
     printf("%d/%d",fn->numerator,fn->denominator);
     p=fn->next;
     while(p!=NULL){
     
     	printf(" %d/%d",p->numerator,p->denominator);
     	p=p->next;
	 }
}
void release(farleipointer head) {
     //       ,head         
      farleipointer p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
 int n;
 farleipointer fn;
 scanf("%d", &n);
 fn = farlei(n); //  n     
 if(fn!=NULL)
        print(fn);
    else
        printf("NULL");
 release(fn);
 return 0;
}

교과서 예제
6번 제목 번호: Exp09-Enhance01
제목: 싱글 체인 테이블 끝에서 K번째 결점
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
          , 0              ;

         K,       K     ,              ,            ;

       NULL。

예를 들어,
  :1 2 3 4 5 6 7 8 0 3

  :6



  :0 2 3 4 5 6 7 8 0 3

  :NULL
#include 
#include 
struct cell {
     //          
 int x;
 struct cell* next;
};
struct cell* build(void) {
     //     ,               
 struct cell* head, * tmp, * p;
 head = tmp = p = NULL;
 int n;
 head=(struct cell*)malloc(sizeof(struct cell));
 scanf("%d",&head->x);
 tmp=head;
 tmp->next=NULL;
 if(head->x==0)head=NULL;
 else{
     
 	do{
     
 		p=(struct cell*)malloc(sizeof(struct cell));
 		scanf("%d",&p->x);
 		if(p->x==0)break;
 		tmp->next=p;
 		tmp=p;
 		tmp->next=NULL;
	 }while(p->x!=0);
 }
 return head;//      
}
struct cell * back(struct cell* head, int k) {
     //      k   ,head         
    struct cell *p,*p0;
    int n=1,i;
    if(head==NULL)head=NULL;
    else{
     
    p=head;
    while(p->next!=NULL){
     
    	n++;
    	p=p->next;
	}
	if(k>n){
     head=NULL;return head;
}
	n=n-k;
	p0=head;
	for(i=n;i>0;i--){
     
	 p0=p0->next;
}
head=p0;
p0->next=NULL;
}
return head;
}
void release(struct cell* head) {
     //       ,head         
 struct cell *p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
 struct cell* head,*result;
 int k;
 head = build();
 scanf("%d", &k);
 result = back(head,k);
 if (result != NULL)
        printf("%d",result->x);
    else
        printf("NULL");
 release(head);
}


7 제목 번호: Exp09-Enhance03
제목: 통합 단일 체인 테이블
제목 설명: 다음 기능을 수행하려면 누락된 코드를 입력하여 프로그램을 완성하십시오.
          0         ,       ,               ;

        ,                  ;

                ,                ;

            ,              ,            。     ,   NULL。

예를 들어,
  :2 3 4 4 5 6 0 1 3 4 6 7 0

  :1 2 3 3 4 4 4 5 6 6 7



  :0 0

  :NULL
#include 
#include 
struct cell {
     //          
 int x;
 struct cell* next;
};
struct cell* build(void) {
     //     ,               
 struct cell* head, * tmp, * tail;
 head = tmp = tail = NULL;
 int n, i;
    head=(struct cell*)malloc(sizeof(struct cell));
    scanf("%d",&head->x);
    tmp=head;
    tmp->next=NULL;
    if(head->x==0)head=NULL;
    else{
     
    	do{
     
    	tail=(struct cell*)malloc(sizeof(struct cell));
    	scanf("%d",&tail->x);
    	if(tail->x==0)break; 
    	tmp->next=tail;
    	tmp=tail;
    	tmp->next=NULL;	
	}while(tail->x!=0);
}
 return head;//      
}
struct cell* combine(struct cell* p, struct cell* q) {
     //      p q
 struct cell* head= NULL,*p0=NULL,*q0=NULL,*r=NULL;
 if (p == NULL && q!= NULL) return q;
 if (p != NULL && q == NULL) return p;
 if (p == NULL && q == NULL) return NULL;
 if(p!=NULL&&q!=NULL){
     
 	head=p;
 	while(head->next!=NULL){
     
 		head=head->next;
	 }
	 head->next=q;
	 return p;
 }
}
void print(struct cell* head) {
     //       ,head         
     struct cell *p,*p0,*r,*r0,*q;
     struct cell *k;
     p0=NULL;
     p=head;
     while(p!=NULL){
     
     	r=head;
     	while((r->x<p->x)&&r!=p){
     
     		r0=r;
     		r=r->next;
		 }
		 if(r!=p){
     
		 	q=p;
		 	p0->next=p->next;
		 	p=p0;
		 	if(r==head){
     
		 		q->next=head;
		 		head=q;
			 }else{
     
			 	q->next=r;
			 	r0->next=q;
			 }
		 }
		 p0=p;
		 p=p->next;
	 }
     printf("%d",head->x); 
	k=head->next;
	while(k!=NULL){
     
		printf(" %d",k->x);
		k=k->next;
	}
}
void release(struct cell* head) {
     //       ,head         
 struct cell *p;
	while(head!=NULL){
     
		p=head;
		head=p->next;
		free(p);
	}
}
int main(void) {
     
 struct cell* head1,*head2, *result;
 head1 = build();
 head2 = build();
 result = combine(head1,head2);
 if (result != NULL)
  print(result);
 else
  printf("NULL");
 release(result);
 return 0;
}

좋은 웹페이지 즐겨찾기