1298150336 发表于 2020-4-14 22:42:26

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

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



#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;
}


chxchxkkk 发表于 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吧

ly落叶 发表于 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;
}

1298150336 发表于 2020-4-15 22:16:56

chxchxkkk 发表于 2020-4-15 09:39
void print(List L)//打印链表
{ L=L->next;
int i;


谢谢,应该是L,但还是有问题{:10_243:}

1298150336 发表于 2020-4-15 22:18:02

ly落叶 发表于 2020-4-15 10:36
都是一些语法错误和不够细心的问题。。。

谢谢纠正我这么多错误,可改了后还是在vc++上运行不了,不知能否麻烦给我解释一下,十分感谢

ly落叶 发表于 2020-4-21 10:43:36

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

是不是scanf_s的报错?我是在VS上运行的,老版VC的话应该直接用scanf就行

1298150336 发表于 2020-4-21 15:55:32

ly落叶 发表于 2020-4-21 10:43
是不是scanf_s的报错?我是在VS上运行的,老版VC的话应该直接用scanf就行

问题已经解决了,十分感谢,不过我想问一下为什么swap不用二级指针照样改变了实参呢??

ly落叶 发表于 2020-4-25 21:11:28

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

因为节点都是以指针形式链接过去的,传入的形参L中保存了下个节点的next指针,所以交换时操作的仍然是之前的内存

1298150336 发表于 2020-4-25 21:23:21

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

谢谢
页: [1]
查看完整版本: 礼貌求助关于打印L中那些由P所指定位置上的元素