c 언어 는 더 블 링크 의 조작 을 실현 합 니 다. 머리 삽입 법, 꼬리 삽입 법, 찾기, 삽입, 삭제

더 블 링크 삽입 동작:
#include 
#include
typedef struct DNode {
	int data;
	struct DNode* prior, * next;
}DNode, * DLinkList;

//-------   ---------
DLinkList insert_head(DLinkList DL) {
	DL = (DLinkList)malloc(sizeof(DNode));
	DL->next = NULL;	DL->prior = NULL;
	DLinkList s;
	int x;	scanf_s("%d", &x);
	while (x != -1) {
		s = (DLinkList)malloc(sizeof(DNode));
		s->data = x;
		s->next = DL->next;
		//             
		if (DL->next != NULL) {
			DL->next->prior = s;
		}
		DL->next = s;
		s->prior = DL;
		scanf_s("%d", &x);
	}

	return DL;
}

//-------   ---------
DLinkList insert_rear(DLinkList DL) {
	DL = (DLinkList)malloc(sizeof(DNode));
    //      r       
	DLinkList s, r = DL;		int x;
	DL->prior = NULL;
	scanf_s("%d", &x);
	while (x != -1) {
		s = (DLinkList)malloc(sizeof(DNode));
		s->data = x;
		r->next = s;
		s->prior = r;
		r = s;
		scanf_s("%d", &x);
	}
	//!!!!!!      r next    NULL
	r->next = NULL;

	return DL;
}

void printDNode(DLinkList DL) {
	DLinkList p = DL->next;
	while (p) {
		printf("%d
", p->data); p = p->next; } } // 1 2 3 -1 int main() { DNode n; //DLinkList DL = insert_head(&n); DLinkList DL = insert_rear(&n); printDNode(DL); return 0; }

 더 블 링크 는 번호 에 따라 요 소 를 찾 습 니 다:
DLinkList findByID(DLinkList DL, int i) {
	//   i      , 0  
	DLinkList p=DL->next;
	int j = 0;
	if (i < 0) return NULL;
	while ( p && j < i) {
		p = p->next;
		j++;
	}
	return p;
}

int main() {
	DNode n;
	DLinkList DL = insert_rear(&n);
	printDNode(DL);

	DLinkList search = findByID(DL, 2);
	printf("a[i]=%d", search->data);
	return 0;
}

링크 의 i 번 째 위치 에 요 소 를 삽입 합 니 다:
void insertByID(DLinkList DL, int i, int x) {
	//  i     x,   0  ;
	DLinkList s = DL;
	DLinkList p;	//        
	p = (DLinkList)malloc(sizeof(DNode));
	p->data = x;
	if (i < 0)		return;
	int j = 0;
	while (j < i) {
		s = s->next;
		j++;
	}
	p->next = s->next;
	s->next -> prior = p;
	s->next = p;
	p->prior = s;

}

int main() {
	DNode n;
	DLinkList DL = insert_rear(&n);

	insertByID(DL, 0, 100);
	printDNode(DL);
	return 0;
}

 또는 findByID () 함 수 를 이용 하여 i - 1 요 소 를 찾 아 그의 지침 을 s 에 되 돌려 줍 니 다.
void insertByID(DLinkList DL, int i, int x) {
	//  i     x,   0  ;
	DLinkList s;
	if (i == 0) s = DL;
	else s = findByID(DL, i - 1);
	DLinkList p;	//        
	p = (DLinkList)malloc(sizeof(DNode));
	p->data = x;
	if (i < 0)		return;

	p->next = s->next;
	s->next -> prior = p;
	s->next = p;
	p->prior = s;

}

i 번 째 요소 삭제:
void deleteByID(DLinkList DL, int i) {
	//   i   , 0    
	DLinkList p;
	if (i == 0)	p = DL;
	else p = findByID(DL, i - 1);
	DLinkList q = p->next;
	//       
	if (q == NULL)	return;
	//          ,       
	if(q->next!=NULL)
		q->next->prior = p;
	p->next = q->next;
	free(q);

}

int main() {
	DNode n;
	DLinkList DL = insert_rear(&n);
	printf("-----delete-----
"); deleteByID(DL, 0); printDNode(DL); return 0; }

좋은 웹페이지 즐겨찾기