qq783369750 发表于 2017-9-4 07:51:30

循环链表如何实现逆向输出

本帖最后由 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;
}

ba21 发表于 2017-9-4 09:15:15

代码运行不了{:10_247:}

qq783369750 发表于 2017-9-4 16:04:37

ba21 发表于 2017-9-4 09:15
代码运行不了

现在可以运行了,我都贴上来了

ba21 发表于 2017-9-4 18:40:58

qq783369750 发表于 2017-9-4 16:04
现在可以运行了,我都贴上来了

在输出时候,新建一个临时联表tmp,把原来的联表插入到tmp中,输出tmp就可,
倒插应该会吧?,就是每次都是在头节点处添加就行了
还有一种是递归。我也没有时间研究,你自己实现下。

qq783369750 发表于 2017-9-5 00:33:15

本帖最后由 qq783369750 于 2017-9-5 00:35 编辑

ba21 发表于 2017-9-4 18:40
在输出时候,新建一个临时联表tmp,把原来的联表插入到tmp中,输出tmp就可,
倒插应该会吧?,就是每次都是在 ...

倒插会的,是不是要写一个倒插的初始化函数?那个怎样建立临时链表啊,可以一次建立两个链表的吗
我也想过这个方法,就是不知道怎样建立两个链表。。。

ba21 发表于 2017-9-5 08:30:40

qq783369750 发表于 2017-9-5 00:33
倒插会的,是不是要写一个倒插的初始化函数?那个怎样建立临时链表啊,可以一次建立两个链表的吗
我也 ...

读取的时候建立个临时表,边读边头插入临时表,最后直接读取临里表

qq783369750 发表于 2017-9-10 23:08:14

已经解决,贴上自己的解决答案。{: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);

        }
}

qq783369750 发表于 2017-9-10 23:09:34

已经解决,贴上自己的解决答案。{: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:36:41

                      加油把

新科技网络公司 发表于 2017-9-13 15:36:56

我们一起研究               

新科技网络公司 发表于 2017-9-13 15:37:33

                                       我要鱼币去学习

吃瓜c与数据 发表于 2017-9-14 14:16:47

拿了鱼币去学习!

qq783369750 发表于 2017-9-15 03:38:02

新科技网络公司 发表于 2017-9-13 15:37
我要鱼币去学习

已经解决了额

qq783369750 发表于 2017-9-15 03:38:34

吃瓜c与数据 发表于 2017-9-14 14:16
拿了鱼币去学习!

没啦没啦,冲会员吧哈{:10_254:}

cyndiwants 发表于 2017-9-16 11:10:50

顶楼主,希望你早日解决

cyndiwants 发表于 2017-9-17 15:49:51

谢谢楼主分享,加油↖(^ω^)↗

cyndiwants 发表于 2017-9-17 15:51:15

加油↖(^ω^)↗,顶楼主喽

cyndiwants 发表于 2017-9-17 15:54:34

我也想中奖,啊,哈哈

cyndiwants 发表于 2017-9-17 15:55:23

谢谢楼主的分享喽,谢谢楼主大大

cyndiwants 发表于 2017-9-17 15:56:01

为什么我就中不了奖呢,伤心&#128549;
页: [1] 2
查看完整版本: 循环链表如何实现逆向输出