user-0 提问: c语言建立双向链表 打印不出来 马上要交作业 急急急~

回复:
user: user-1
content: 这排版。。还是告别编程吧

user: user-2
content: //#include"stdio.h" //#include"stdlib.h" #include <stdio.h> #include <stdlib.h>  typedef struct  dlink_node{     int info;     struct dlink_node *llink, *rlink; }dnode;  dnode *init() {     return NULL; }  void display(dnode *head) {     dnode *p, *q;     p = q = head;      if (!p)  {         printf("\n链表是空的\n");         return;     }     printf("双链表中的值从左到右为\n");     while (p) {         printf("%d ", p->info);         q = p;         p = p->rlink;     }     putchar(10);     printf("双链表中的值从右到左为：\n");     p = q;     while (p) {         printf("%d ", p->info);         p = p->llink;     }     putchar(10); }  dnode *find(dnode *head, int i) {     int j = 1;     dnode *p = head;     if (i < 1) { printf("\n第%d个结点不存在\n", i);return NULL; }     while (p&&j != i)     {         p = p->rlink;j++;     }     if (!p) { printf("\n第%d个结点不存在\n",i); return NULL; }     return p; }  dnode *insert(dnode *head, int x, int i) {     dnode *p, *q;     p = (dnode*)malloc(sizeof(dnode));     p->info = x;     if (i == 0)     {         p->llink = NULL;         p->rlink = head;         if (!head) { head = p; }         else { head->llink = p;head=p; }         return head;     }     q = find(head, i);     if (!q) { printf("第%d个结点不存在，无法插入",i);free(p);return head; }     else if (q->rlink == NULL)     {         p->rlink = NULL;         q->rlink = p;         p->llink = q;     }     else     {         p->rlink = q->rlink;         q->rlink->llink = p;         q->rlink = p;         p->llink = q;     }     return head; }  dnode *dele(dnode *head,int x) {     dnode *q;     if (!head) { printf("双链表为空，不能删除"); return NULL; }     q = head;     while (q&&q->info != x) q = q->rlink;     if (!q)printf("没有找到值为%d的结点~不能删除~",x);     if (q == head && !head->rlink)     {         free(q); return NULL;/*变成空的了耶qwq*/     }     if (q == head && head->rlink)     {         head = head->rlink;head->llink = NULL; free(q);         return head;     }     else     {         if (!q->rlink)         {             q->llink->rlink = NULL; free(q);             return head;         }         else         {             q->llink->rlink = q->rlink;             q->rlink->llink= q->llink;             free(q); return head;         }     } }  int main() {     puts("≡ω≡");     dnode *s;     dnode *head = NULL;     int length,data,i, x, num,j;      s = head;     printf("请定义双向链表的长度：");     scanf_s("%d", &length);     dnode *A;/*创建一个链表*/     //A=init();/*初始化*/     A = NULL;/*初始化*/      dnode *tail = NULL;     printf("请输入元素:\n");     for(j = 0;j <length;j++)     {         s = (dnode *)malloc(sizeof(dnode));         scanf_s("%d", &data);         s->info = data;         s->llink = NULL;         s->rlink = NULL;         if (!A) {             A = s;             tail = A;         } else {             s->llink = tail;             tail->rlink = s;             tail = s;         }     }      /*逐个获取*/     display(A);     while (1)     {         printf("\n请选择功能:\n");         printf("1、插入 2、删除\n");         scanf_s("%d", &num);         switch (num)         {             case 1: printf("请输入想要插入的元素:\n");                     scanf_s("%d", &x);                     printf("请选择想要插入的位置:\n");                     scanf_s("%d", &i);//插入                     insert(A, x, i); display(A);                     break;              case 2: printf("请输入想要删除的元素:\n");                     scanf_s("%d", &x);//删除                     dele(A, x); display(A);                     break;         }     } } 参考一下吧  代码风格建议注意下，代码不单单是运行出结果，更多的是代码的可读性要好，别人看着才会舒心。  创建和显示都修改了，查找和插入建议自己继续改一下

user: user-3
content: 没看完，感觉好多问题： 1， 那个Init完全没啥实际意义，估计想保存head，但实际没有做到 2， display函数中逻辑有问题， 从右到左应该永远不会打出东西 printf("双链表中的值从左到右为\n"); while (p) { printf("%d", p->info);p = p->rlink; } printf("双链表中的值从右到左为：\n"); while (p) { printf("%d", p->info);p = p->llink; } 3， main 函数里面获取节点有不少问题， 分配了空间没初始化， 左节点未赋值，head和A没关系导致你根本没操作链表（） s = (dnode*)malloc(sizeof(dnode)); scanf_s("%d", &data); s->info = data;s = s->rlink;

user: user-4
content: 在你的基础上修改了下，改的地方基本都加了注释了。编程这一路任重而道远啊  #include"stdio.h" #include"stdlib.h" typedef struct  dlink_node{ 	int info; 	struct dlink_node *llink, *rlink; }dnode;  dnode *init() { 	return NULL; }  void display(dnode *head) { 	dnode *p; 	p = head; 	if (!p) printf("\n链表是空的\n"); 	else 	{ 		printf("双链表中的值从左到右为\n"); 		while (p) { printf("%d  ", p->info);p = p->rlink; } 		printf("\n双链表中的值从右到左为：\n"); 		p = head; //需要重新初始化p指针位置 		while(p->rlink) 			p = p->rlink; 		while (p) { printf("%d  ", p->info);p = p->llink; } 	} }  dnode *find(dnode *head, int i) { 	int j = 1; 	dnode *p = head; 	if (i < 1) { printf("\n第%d个结点不存在\n", i);return NULL; } 	while (p&&j != i) 	{ 		p = p->rlink;j++; 	} 	if (!p) { printf("\n第%d个结点不存在\n",i); return NULL; } 	return p; }  dnode *insert(dnode *head, int x, int i) { 	dnode *p, *q; 	p = (dnode*)malloc(sizeof(dnode)); 	p->info = x; 	if (i == 0) 	{ 		p->llink = NULL; 		p->rlink = head; 		if (!head) { head = p; } 		else { head->llink = p;head=p; } 		return head; 	} 	q = find(head, i); 	if (!q) { printf("第%d个结点不存在，无法插入",i);free(p);return head; } 	else if (q->rlink == NULL) 	{ 		p->rlink = NULL; 		q->rlink = p; 		p->llink = q; 	} 	else 	{ 		p->rlink = q->rlink; 		q->rlink->llink = p; 		q->rlink = p; 		p->llink = q; 	} 	return head; }  dnode *dele(dnode **heads,int x) { 	//修改一级指针的值，需要传二级指针，也就是一级指针的地址 	dnode * head = *heads; 	dnode *q; 	if (!head) { printf("双链表为空，不能删除"); return NULL; } 	q = head; 	while (q&&q->info != x) q = q->rlink; 	if (!q)printf("没有找到值为%d的结点~不能删除~",x); 	if (q == head && !head->rlink) 	{ 		free(q); 		*heads = NULL; 		return NULL;/*变成空的了耶qwq*/ 	} 	if (q == head && head->rlink) 	{ 		*heads = head->rlink; 		(*heads)->llink = NULL; 		free(q); 		return NULL; 	} 	else 	{ 		if (!q->rlink) 		{ 			q->llink->rlink = NULL; free(q); 			return head; 		} 		else 		{ 			q->llink->rlink = q->rlink; 			q->rlink->llink= q->llink; 			free(q); return head; 		} 	} }  int main() { 	puts("≡ω≡"); 	dnode *s; 	dnode *head = NULL; 	s = head; 	int length,data,i, x, num,j; 	printf("请定义双向链表的长度："); 	scanf("%d",&length); 	dnode *A;/*创建一个链表*/ 	A=init();/*初始化*/ 	printf("请输入元素:\n"); 	for(j = 0;j <length;j++) 	{ 		if(A == NULL){ 			A = (dnode*)malloc(sizeof(dnode)); 			scanf("%d", &data); 			A->info = data; 			A->llink = NULL; 			A->rlink = NULL; 		} 		else{ 			int len =  1; 			dnode* findPtr = A; 			scanf("%d", &data); 			while (findPtr->rlink){ 				++len; 				findPtr = findPtr->rlink; 			} 			insert(A, data, len); 		}  	}/*逐个获取*/ 	display(A); 	while (1) 	{ 		printf("\n请选择功能:\n"); 		printf("1、插入 2、删除\n"); 		scanf("%d", &num); 		switch (num) 		{ 		case 1: printf("请输入想要插入的元素:\n"); 			scanf("%d", &x); 			printf("请选择想要插入的位置:\n"); 			scanf("%d", &i);//插入 			insert(A, x, i); display(A);break; 		case 2: printf("请输入想要删除的元素:\n"); 			scanf("%d", &x);//删除 			dele(&A, x); display(A);break; 		} 	} }