循环链表如何实现逆向输出
本帖最后由 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;
} 代码运行不了{:10_247:} ba21 发表于 2017-9-4 09:15
代码运行不了
现在可以运行了,我都贴上来了 qq783369750 发表于 2017-9-4 16:04
现在可以运行了,我都贴上来了
在输出时候,新建一个临时联表tmp,把原来的联表插入到tmp中,输出tmp就可,
倒插应该会吧?,就是每次都是在头节点处添加就行了
还有一种是递归。我也没有时间研究,你自己实现下。 本帖最后由 qq783369750 于 2017-9-5 00:35 编辑
ba21 发表于 2017-9-4 18:40
在输出时候,新建一个临时联表tmp,把原来的联表插入到tmp中,输出tmp就可,
倒插应该会吧?,就是每次都是在 ...
倒插会的,是不是要写一个倒插的初始化函数?那个怎样建立临时链表啊,可以一次建立两个链表的吗
我也想过这个方法,就是不知道怎样建立两个链表。。。
qq783369750 发表于 2017-9-5 00:33
倒插会的,是不是要写一个倒插的初始化函数?那个怎样建立临时链表啊,可以一次建立两个链表的吗
我也 ...
读取的时候建立个临时表,边读边头插入临时表,最后直接读取临里表 已经解决,贴上自己的解决答案。{:10_256:}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int temp,tempzahl,*lauf=NULL,*zahlen=NULL;
int i;
printf("Wie viele Zahlen moechten Sie eingeben?");
scanf("%d",&temp);
zahlen=(int*)malloc(sizeof(int)*temp);
lauf=zahlen;
for(i=0;i<temp;i++)
{
printf("geben Sie die %d zahlen ein:",i+1);
scanf("%d",&tempzahl);
getchar();
*lauf=tempzahl;
lauf++;
}
for(i=0;i<temp;i++)
{
lauf--;
printf("%d ", *lauf);
}
} 已经解决,贴上自己的解决答案。{:10_256:}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int temp,tempzahl,*lauf=NULL,*zahlen=NULL;
int i;
printf("Wie viele Zahlen moechten Sie eingeben?");
scanf("%d",&temp);
zahlen=(int*)malloc(sizeof(int)*temp);
lauf=zahlen;
for(i=0;i<temp;i++)
{
printf("geben Sie die %d zahlen ein:",i+1);
scanf("%d",&tempzahl);
getchar();
*lauf=tempzahl;
lauf++;
}
for(i=0;i<temp;i++)
{
lauf--;
printf("%d ", *lauf);
}
} 加油把 我们一起研究 我要鱼币去学习 拿了鱼币去学习! 新科技网络公司 发表于 2017-9-13 15:37
我要鱼币去学习
已经解决了额 吃瓜c与数据 发表于 2017-9-14 14:16
拿了鱼币去学习!
没啦没啦,冲会员吧哈{:10_254:} 顶楼主,希望你早日解决 谢谢楼主分享,加油↖(^ω^)↗ 加油↖(^ω^)↗,顶楼主喽 我也想中奖,啊,哈哈 谢谢楼主的分享喽,谢谢楼主大大 为什么我就中不了奖呢,伤心😥
页:
[1]
2