doublelink.c

来自「自己做的常用库和实现的数据结构。public domain.」· C语言 代码 · 共 103 行

C
103
字号
/* Demo of simple double link manipulation. * * Written by Cyril Hu (cyrilhu@gmail.com), public domain. */#include<stdio.h>#include<stdlib.h>#define MAX_LEN 10#define MEM(X) if( ((X)=(A *)malloc(sizeof(A))) == NULL) { \			fprintf(stderr, "Fatal: MEM alloc fail"); \			exit(EXIT_FAILURE); \		}typedef struct a {	int sn;	struct a *prev;	struct a *next;} A;static A *rev(A *head, int n){	A *t, *p;	int i,j;	for(p=head,i=0; i < n/2; i++,p = p->next) {		for(j=1,t=head; j < n-i; j++) {			t = t->next;		}		j = p->sn; p->sn = t->sn; t->sn = j;	}	return head;}int main(void){	A a, *head, *tail, *t, *p;	int i;	for(p=&a,i=0; i<MAX_LEN; i++) {		MEM(p->next)		p = p->next;		p->sn = i;	}	p->next = NULL;	puts("original link");	for(p=a.next; p != NULL; p = p->next) {		printf("%d ", p->sn);	}	puts("\nlink reversed");	head = rev(a.next, MAX_LEN);	for(p=head; p != NULL; p = p->next) {		printf("%d ", p->sn);	}	puts("\nreversed again");	head = rev(head, MAX_LEN);	for(p=head; p != NULL; p = p->next) {		printf("%d ", p->sn);	}	for(i=0; i<MAX_LEN; i++) {		MEM(p)		p->sn = i+10;		if(i == 0) {			head = t = p;			p->prev = NULL;		} else {			t->next = p;			p->prev = t; 			t = p;		}	}	tail = p;	p->next = NULL;	puts("\n\nprint new original link from head to tail");	for(p=head; p != NULL; p = p->next) {		printf("%d ", p->sn);	}	puts("\nprint from tail to head");	for(p=tail; p != NULL; p = p->prev) {		printf("%d ", p->sn);	}	puts("\nlink reversed, print from head to tail");	head = rev(head, MAX_LEN);	for(p=head; p != NULL; p = p->next) {		printf("%d ", p->sn);	}	puts("\nreversed again, print from tail to head");	head = rev(head, MAX_LEN);	for(p=tail; p != NULL; p = p->prev) {		printf("%d ", p->sn);	}	puts("");	return EXIT_SUCCESS;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?