단 방향 순환 링크 현지 역 치

원래 자신 이 생각 하 는 것 을 생각해 보 았 는데, 후에 완전히 정확 하지 않다 는 것 을 발견 하 였 다.
결국 인터넷 에서 알고리즘 을 찾 아야 만 이 루어 진 것 같다.
        (1) 링크 가 빈 시계 이거 나 하나의 노드 만 있 을 때 이 링크 의 역 치 링크 는 원래 표 와 같다.(2) 링크 가 2 개 이상 의 노드 를 포함 할 때 이 링크 를 첫 번 째 노드 만 포함 하 는 선두 노드 링크 와 머리 가 없 는 노드 를 포함 하 는 링크 로 처리 할 수 있다.그 다음 에 이 무 두 결점 체인 테이블 의 모든 결점 을 체인 테이블 지침 에 따라 이동 한 후에 모든 결점 을 무 두 결점 체인 테이블 에서 순서대로 떼 어 내 고 첫 번 째 결점 으로 선두 결점 체인 테이블 에 삽입한다.이렇게 하면 역 치 된 체인 시 계 를 얻 을 수 있다.
구체 적 으로 는 어렵 지 않 아 요. 종이 위 에 그림 을 그리 면 나 와 요 ~ ~
#include <iostream>
#include <malloc.h>

#define OK    1
#define ERROR 0
#define LENGTH 10

typedef int ElemType;
typedef int Status;

typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode, *LinkList;

//    
Status CreateList(LinkList &L)
{
	LinkList s = NULL;
	int i = 0;
	L = (LinkList)malloc(sizeof(LNode) * LENGTH);
	L->next = NULL;
	L->data = 0;

	for (i = 1; i <= LENGTH; i++)
	{
		s = (LinkList)malloc(sizeof(LNode));
		s->data = 10 - i + 1;
		s->next = L->next;
		L->next = s;
	}
	return OK;
}

//    
Status InverseList(LinkList &L)
{
	LinkList p = NULL;
	LinkList q = NULL;
	//   L    
	if (L && L->next )//            
	{
	//        
		p = L->next;
		q = p->next;
		p->next = NULL;
	}

	//                                      
	while (q)
	{
		p = q;
		q = q->next;
		p->next = L->next;
		L->next = p;
	}
	return OK;
}

//    
Status PrintfList(LinkList L)
{
	int i = 0;
	if (L == NULL)
		std::cout<<"      "<<std::endl;
	while(L->next != NULL)
	{
		std::cout<<" "<<i<<"      :"<<L->data<<std::endl;
		L = L->next;
		i++;
	}	
	std::cout<<" "<<i<<"      :"<<L->data<<std::endl;
	std::cout<<std::endl;
	return OK;
}

//    
Status DeleteList(LinkList &L)
{
	LinkList p = NULL;
	while (L->next)
	{
		p = L->next;
		L->next = p->next;
		free(p);
	}
	
	return OK;
}

int main()
{
	
	LinkList L = NULL;

	//    ,   10   
	CreateList(L);

	//    
	PrintfList(L);
	
	//    
	InverseList(L);
	
	//      
	PrintfList(L);

	//    
	DeleteList(L);

	//          
	PrintfList(L);

	return 0;
}

좋은 웹페이지 즐겨찾기