데이터 구조 02 - 선형 구조 1 두 질서 있 는 링크 시퀀스 의 합병

제목.
이 문 제 는 하나의 함 수 를 실현 하고 두 개의 링크 가 표시 하 는 증가 정수 서열 을 비 체감 의 정수 서열 로 합 쳐 야 한다.
함수 인터페이스 정의:
List Merge( List L1, List L2 );

그 중에서 List 구조 정 의 는 다음 과 같다.
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /*        */
    PtrToNode   Next; /*            */
};
typedef PtrToNode List; /*         */
L1L2 는 주어진 선두 노드 의 단일 체인 표 로 그 노드 에 저 장 된 데 이 터 는 점점 질서 가 있다.함수 MergeL1L2 를 비 체감 의 정수 서열 로 합 쳐 야 한다.원 시퀀스 의 결점 을 직접 사용 하고 귀 합 된 선두 결점 의 체인 헤더 지침 을 되 돌려 야 한다.
심판 테스트 프로그램 샘플:
#include 
#include 

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /*        */
void Print( List L ); /*       ;      NULL */

List Merge( List L1, List L2 );

int main()
{
    List L1, L2, L;
    L1 = Read();
    L2 = Read();
    L = Merge(L1, L2);
    Print(L);
    Print(L1);
    Print(L2);
    return 0;
}

/*            */

입력 예시:
3 1 3 5 5 2 4 6 8 10
출력 예시:
1 2 3 4 5 6 8 10 NULL NULL
분석 하 다.
먼저 head 기록 L 링크 의 시작 을 만 들 고 두 링크 의 현재 노드 의 데이터 도 메 인 값 을 순환 적 으로 비교 한 다음 에 작은 노드 (tmpLn 으로 기록) 를 링크 L 의 뒤에 L 뒤에 추가 하 는 작업 은 모두 3 단계 입 니 다.
  • L -> Next = tmpLn, 결점 을 L 뒤에 추가
  • tmpLn = tmpLn -> Next, 작은 매듭 점 을 뒤로 이동
  • L = L -> Next, L 뒤로 이동
  • 어떤 링크 가 끝 날 때 까지 다른 링크 의 나머지 노드 를 L 뒤에 다 넣 으 면 끝 이 나 는 거 죠?제출, 모든 오류 문제 가 어디 에 있 습 니까? 작은 세부 사항 을 살 펴 보 겠 습 니 다.
  • 예 를 들 어 알 수 있 듯 이 L1 L2 가 합병 되면 L1 L2 는 모두 NULL 이 되 었 다. 나의 해결 방법 은 합병 이 끝 난 후에 L1 -> Next 와 L2 -> Next 를 NULL
  • 로 직접 설정 하 는 것 이다.
  • 링크 의 헤드 노드 데이터 도 메 인 은 값 이 없습니다. 즉, 예제 에 L1 에 입력 한 1 저장 위 치 는 실제 L -> next -> Data...
  • List Merge( List L1, List L2 ){
    	List L=(List)malloc(sizeof(struct Node));
    	List head = L;  //   L     
    	List tmpL1 = L1->Next;   //tmpL1->Data      
    	List tmpL2 = L2->Next;   
    	while(tmpL1 && tmpL2){   //  L1   L2     
    		if(tmpL1->Data < tmpL2->Data){
    			L->Next=tmpL1;
    			tmpL1=tmpL1->Next;
    		}else{
    			L->Next=tmpL2;
    			tmpL2=tmpL2->Next;
    		}
    		L=L->Next;
    	}
    	if(tmpL1)  //     L1       ,         L   
    		L->Next=tmpL1;
    	if(tmpL2)
    		L->Next=tmpL2;
    	L1->Next = NULL;  //    L1 L2   NULL
    	L2->Next = NULL;
    	return head;
    } 
    

    구덩이 가 많 으 니 조심해 라!

    좋은 웹페이지 즐겨찾기