鱼C论坛

 找回密码
 立即注册
查看: 785|回复: 8

[已解决]礼貌求助关于打印L中那些由P所指定位置上的元素

[复制链接]
发表于 2020-4-14 22:42:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这段代码我不知道哪里错了,真是裂开了啊,求解决,十分感谢



#include<stdio.h>
#include<stdlib.h>
#include<time.h>


struct Node{
        int data;
        struct Node *next;
};
typedef struct Node *List;


List Creat();
List Creat()//创建单链表
{int i,n;
printf("请输入链表的长度:");
scanf("%d",&n);
  List L=(List)malloc(sizeof(struct Node));
if(!L)
         return NULL;
L->next=NULL;
srand(time(0));
for(i=0;i<n;i++)
{List p=(List)malloc(sizeof(List));
if(!p)
         return NULL;
p->data=rand()%100+1;
p->next=NULL;
L->next=p;
L=p;}
return L;
}

void swap(List L,int n);
void swap(List L,int n)/*交换是当前位置和后面一个位置交换*/
{int i;
for(i=1;i<n,i++)
L=L->next;
if(L->next=NULL)
{printf("错误输入\n");
return;}
List L1,L2;
L1=L->next;
L2=L1->next;


L1->next=L2->next;
L->next=L2;
L2->next=L1;
}
}

void print(List L);
void print(List L)//打印链表
{ L=L->next;
int i;
for(i=0;p!=NULL;i++)
{printf("%d",p->data);
p=p->next;}
}

int main()
{List L;
L=Creat();
print(L);
int n;
printf("请输入交换的元素于链表所在位置:");
scanf("%d",&n);
swap(L,n);//这里是不是应该传入地址???
printf("交换后:");
print(L);
return 0;
}


最佳答案
2020-4-15 10:36:21
都是一些语法错误和不够细心的问题。。。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


struct Node {
        int data;
        struct Node *next;
};
typedef struct Node *List;


List Creat();
List Creat()//创建单链表
{
        int i, n;
        printf("请输入链表的长度:");
        scanf_s("%d", &n);
        List L = (List)malloc(sizeof(struct Node));
        List Head = L;
        if (!L)
                return NULL;
        L->next = NULL;
        srand(time(0));
        for (i = 0; i < n; i++)
        {
                List p = (List)malloc(sizeof(List));
                if (!p)
                        return NULL;
                p->data = rand() % 100 + 1;
                p->next = NULL;
                L->next = p;
                L = p;
        }
        return Head; //返回值一般为头节点,而不是尾节点
}

void swap(List L, int n);
void swap(List L, int n)/*交换是当前位置和后面一个位置交换*/
{
        int i;
        for (i = 1; i < n; i++)
                L = L->next;
        if (L->next == NULL)   // =赋值,应该是逻辑等于==
        {
                printf("错误输入\n");
                return;
        }
        List L1, L2;
        L1 = L->next;
        L2 = L1->next;


        L1->next = L2->next;
        L->next = L2;
        L2->next = L1;
}
//} //多了个括号。。。

void print(List L);
void print(List L)//打印链表
{
        L = L->next;
        int i;
        for (i = 0; L != NULL; i++)
        {
                printf("%d\t", L->data); //p不知道从哪来的,逻辑上看应该是L
                L = L->next;
        }
        printf("\n");
}

int main()
{
        List L;
        L = Creat();
        print(L);
        int n;
        printf("请输入交换的元素于链表所在位置:");
        scanf_s("%d", &n);
        swap(L, n);//这里是不是应该传入地址???
        printf("交换后:");
        print(L);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-15 09:39:55 | 显示全部楼层
void print(List L)//打印链表
{ L=L->next;
int i;
for(i=0;p!=NULL;i++)
{printf("%d",p->data);
p=p->next;}
} ===>>>这里的p是在哪儿定义的呢, 应该是 List p = L->next吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-15 10:36:21 | 显示全部楼层    本楼为最佳答案   
都是一些语法错误和不够细心的问题。。。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>


struct Node {
        int data;
        struct Node *next;
};
typedef struct Node *List;


List Creat();
List Creat()//创建单链表
{
        int i, n;
        printf("请输入链表的长度:");
        scanf_s("%d", &n);
        List L = (List)malloc(sizeof(struct Node));
        List Head = L;
        if (!L)
                return NULL;
        L->next = NULL;
        srand(time(0));
        for (i = 0; i < n; i++)
        {
                List p = (List)malloc(sizeof(List));
                if (!p)
                        return NULL;
                p->data = rand() % 100 + 1;
                p->next = NULL;
                L->next = p;
                L = p;
        }
        return Head; //返回值一般为头节点,而不是尾节点
}

void swap(List L, int n);
void swap(List L, int n)/*交换是当前位置和后面一个位置交换*/
{
        int i;
        for (i = 1; i < n; i++)
                L = L->next;
        if (L->next == NULL)   // =赋值,应该是逻辑等于==
        {
                printf("错误输入\n");
                return;
        }
        List L1, L2;
        L1 = L->next;
        L2 = L1->next;


        L1->next = L2->next;
        L->next = L2;
        L2->next = L1;
}
//} //多了个括号。。。

void print(List L);
void print(List L)//打印链表
{
        L = L->next;
        int i;
        for (i = 0; L != NULL; i++)
        {
                printf("%d\t", L->data); //p不知道从哪来的,逻辑上看应该是L
                L = L->next;
        }
        printf("\n");
}

int main()
{
        List L;
        L = Creat();
        print(L);
        int n;
        printf("请输入交换的元素于链表所在位置:");
        scanf_s("%d", &n);
        swap(L, n);//这里是不是应该传入地址???
        printf("交换后:");
        print(L);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 22:16:56 | 显示全部楼层
chxchxkkk 发表于 2020-4-15 09:39
void print(List L)//打印链表
{ L=L->next;
int i;

谢谢,应该是L,但还是有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-15 22:18:02 | 显示全部楼层
ly落叶 发表于 2020-4-15 10:36
都是一些语法错误和不够细心的问题。。。

谢谢纠正我这么多错误,可改了后还是在vc++上运行不了,不知能否麻烦给我解释一下,十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-21 10:43:36 | 显示全部楼层
1298150336 发表于 2020-4-15 22:18
谢谢纠正我这么多错误,可改了后还是在vc++上运行不了,不知能否麻烦给我解释一下,十分感谢

是不是scanf_s的报错?我是在VS上运行的,老版VC的话应该直接用scanf就行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-21 15:55:32 | 显示全部楼层
ly落叶 发表于 2020-4-21 10:43
是不是scanf_s的报错?我是在VS上运行的,老版VC的话应该直接用scanf就行

问题已经解决了,十分感谢,不过我想问一下为什么swap不用二级指针照样改变了实参呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-25 21:11:28 | 显示全部楼层
1298150336 发表于 2020-4-21 15:55
问题已经解决了,十分感谢,不过我想问一下为什么swap不用二级指针照样改变了实参呢??

因为节点都是以指针形式链接过去的,传入的形参L中保存了下个节点的next指针,所以交换时操作的仍然是之前的内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-25 21:23:21 | 显示全部楼层
ly落叶 发表于 2020-4-25 21:11
因为节点都是以指针形式链接过去的,传入的形参L中保存了下个节点的next指针,所以交换时操作的仍然是之 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-17 02:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表