C 언어 양 방향 링크 의 실현 (간단 한 실현)

3385 단어 데이터 구조
최근 에 데이터 구조의 양 방향 링크 를 볼 시간 이 있 었 습 니 다. 사실은 단 방향 링크 의 규칙 과 같 습 니 다. 노드 를 정의 할 때 단 방향 링크 보다 i 가 앞의 노드 를 가리 키 는 지침 을 더 정의 하면 됩 니 다. 노드 를 삽입 하고 노드 를 삭제 할 때 그림 을 그 리 는 것 이 가장 좋 은 방법 입 니 다.
양 방향 으로 사용 할 때 중요 한 것 은 체인 헤더 와 링크 꼬리 를 얻 는 것 이 고 아래 에 얻 은 관련 함수 가 있 습 니 다.
// copyright reserved by GongXu
// doubly linked list for simple using
#include
#include
/*                  ,         ,          */
typedef int Data_type;
struct Node_doubly {
	Data_type data;
	struct Node_doubly* prev;
	struct Node_doubly* next;
};
typedef struct Node_doubly* Node_p;
/*           */
Node_p create_list(){
	Node_p list_head = (Node_p)malloc(sizeof(struct Node_doubly));
	list_head->prev = NULL;
	list_head->next = NULL;
	return list_head;
}

/*         ,                  */
Node_p create_list_node(Data_type  data){
	Node_p new_node = malloc(sizeof(struct Node_doubly));
	new_node->data = data;
	return new_node;
};
/*            */
void insert_node_by_head (Node_p list,Data_type data){
	Node_p new_node = create_list_node(data);
	//        
	if (list->next){
		list->next->prev = new_node;
		new_node->next = list->next;
		new_node->prev = list;
		list->next = new_node;
	}
	//          ,     
	else{
		list->next = new_node;
		new_node->prev = list;
		new_node->next = NULL;

	}
	
	
}
/*            */
void delete_node_by_head(Node_p list){
	Node_p ptr = list->next;
	list->next = ptr->next;
	free(ptr);
}
/*             */
void delete_node_by_pos(Node_p list, Data_type pos){
	Node_p p_for = list;
	Node_p p_aft = list->next;
	while (p_aft->data != pos){
		p_for = p_aft;
		p_aft = p_aft->next;
		if (p_aft == NULL){
			printf("Not  finding Positon to delete
"); return; } } Node_p ptr = p_aft->next; p_for->next = ptr; ptr->prev = p_for; free(p_aft); } /* */ Node_p get_lastNode(Node_p list){ Node_p ptr = list->next; Node_p ptr_after = ptr; if (ptr){ while (ptr != NULL){ ptr_after = ptr; ptr = ptr->next; } return ptr_after; } else return list; } /* , */ void print_list(Node_p list){ Node_p ptr = list->next; while (ptr != NULL){ printf("%d\t", ptr->data); ptr=ptr->next; } printf("
"); } /* , */ void print_list_with_last(Node_p last_list){ Node_p ptr = last_list; while (ptr->prev != NULL){ printf("%d\t", ptr->data); ptr = ptr->prev; } printf("
"); } /* , */ void destroy_list(Node_p list){ Node_p ptr = list; Node_p ptr_q ; while (ptr != NULL){ ptr_q=ptr->next; ptr->next=ptr_q->next; free(ptr_q); ptr = ptr->next; } list = NULL; } /* */ int main(void){ // Node_p List_head=create_list(); // insert_node_by_head(List_head, 10); insert_node_by_head(List_head, 11); insert_node_by_head(List_head, 12); insert_node_by_head(List_head, 13); // print_list(List_head); // Node_p last_list = get_lastNode(List_head); print_list_with_last(last_list); print_list(List_head); delete_node_by_head(List_head); delete_node_by_head(List_head); print_list(List_head); delete_node_by_pos(List_head,11); print_list(List_head); // destroy_list(List_head); print_list(List_head); while (1); }

좋은 웹페이지 즐겨찾기