|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 qq783369750 于 2017-9-4 16:05 编辑
在这里贴上相关部分的代码,1为初始化,7为逆向输出。现在问题是逆向输出第一个元素并不能有效逆向。逆向输出代码我在网上找的,没看懂求大神解释一下谢谢~帮忙运行一下感激涕零了。
- #include<stdio.h>
- #include<stdlib.h>
- typedef struct Linklist
- {
- int n;
- struct Linklist *next;
- }node;
- void list_init(node **p)
- {
- node *temp;
- node *target;
-
- int item;
-
- printf("输入结点的值,输入0完成初始化\n");
-
- while(1)
- {
- printf("输入结点:");
- scanf("%d",&item);
- fflush(stdin);
-
- if(item)
- {
- if((*p)==NULL)
- {
- *p=(node*)malloc(sizeof(node));
- /*if(!(*pNode))
- exit(0);*/
- (*p)->n=item;
- (*p)->next=*p;
- }
- else
- {
-
-
- for(target=(*p);target->next!=(*p);target=target->next);//这句忘写了,扫描指针用来确定最后一个元素在哪里,不然无法确定最后一个元素
-
- temp=(node*)malloc(sizeof(node));
-
- temp->n=item;
-
- target->next=temp;
- temp->next=*p;
- }
-
- }
-
- else
- {
- return;
- }
- }
- }
- void list_add(node **p,int i)
- {
- int j;
- int item;
- node *target;
- node *temp;
- node *q;
-
- printf("输入你想要插入的值:");
- scanf("%d",&item);
-
- if(i==1)
- {
- temp=(node*)malloc(sizeof(node));
- temp->n=item;
-
- for(target=*p;target->next!=*p;target=target->next);
-
- temp->next=*p;
- target->next=temp;
- *p=temp;
- }
-
- else if(i>1)
- {
- temp=(node*)malloc(sizeof(node));
- temp->n=item;
-
- target=*p;
-
- for(j=1;j<(i-1);j++)
- {
-
- target=target->next;
- }
-
-
- q=target->next;
- target->next=temp;
- temp->next=q;
-
- }
-
- else
- {
- printf("输入错误");
- return;
- }
-
- }
- void list_del(node **p, int i)
- {
- node *target;
- node *temp;
- int j;
-
- temp=*p;
-
- if(i==1)
- {
-
- for(target=*p;target->next!=*p;target=target->next);
- target->next=target->next->next;
- *p=target->next;
- free(temp);
- }
-
- else if (i>1)
- {
- target=*p;
- for(j=1;j<i;j++)
- {
- temp=target;
- target=target->next;
- }
- if(target->next==*p)
- {
- temp->next=*p;
- free(target);
- }
- else
- {
- temp->next=target->next;
- free(target);
- }
-
- }
- }
- void Traverse(node *p)
- {
- int i;
- node *target;
- printf("链表为:");
-
-
- if(p!=NULL)
- {
- target=p;
- do //for(target->next!=p;target=target->next)
- {
- printf("%d ", target->n);
- }
- while((target=target->next)!=p);
-
- }
- else
- {
- printf("链表还未创建");
- }
- }
- void list_suchen(node *p,int i)
- {
- node *target;
- int j=1;
-
-
- //for(target=p;target->next!=p;target=target->next)
- target=p;
- do
- {
- if(target->n==i)
- {
- printf("找到该元素在第%d个结点",j);
-
- }
-
- j++;
-
- }
- while((target=target->next)!=p);
-
- /*if(target->n==i)
- {
- printf("找到该元素在第%d个结点",j);
- }*/
- }
- void list_loesen(node **p)
- {
- node *temp;
- node *target;
-
- for(target=*p;target->next!=*p;target=target->next);
-
- target->next=NULL;
-
- free(*p);
- }
- int list_count(node *p)
- {
- int j=1;
- node *target;
- for(target=p;target->next!=p;target=target->next)
- {
- j++;
- }
- return j;
- }
- void list_l_print(node *p)
- {
- node *target;
-
- for (target=p;target->next!=p;target=target->next)
- {
- printf("%d ",target->n);
- }
-
- }
- void list_r_print(node **p)
- {
- node *current, *temp;
- current=(*p)->next;
- if(current!=(*p))
- {
- temp=current;
- current=current->next;
- temp->next=(*p);
- }
-
- while(current!=(*p))
- {
- temp=current;
- current=current->next;
- temp->next=(*p)->next;
- (*p)->next=temp;
- }
-
- }
- int main()
- {
- node *p=NULL;
- char opp;
- int find;
- int count;
-
- while(opp!='0')
- {
- scanf("%c",&opp);
- switch(opp)
- {
- case '1':
- list_init(&p);
- printf("\n");
- Traverse(p);
- break;
- case '2':
- printf("输入你想要插入节点的位置:");
- scanf("%d",&find);
- list_add(&p, find);
- printf("\n");
- Traverse(p);
- break;
- case '3':
- printf("输入你想要删除节点的位置:");
- scanf("%d",&find);
- list_del(&p, find);
- printf("\n");
- Traverse(p);
- break;
- case '4':
- printf("输入你想要查找的值:");
- scanf("%d",&find);
- list_suchen(p,find);
- break;
- case '5':
- list_loesen(&p);
- break;
- case '6':
- count=list_count(p);
- printf("链表一共有%d个元素",count);
- break;
- case '7' :
- list_r_print(&p);
- break;
-
- }
- }
- return 0;
- }
复制代码
输出之后就是这样的
|
|