礼貌求助关于打印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;
}
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吧 都是一些语法错误和不够细心的问题。。。
#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;
}
chxchxkkk 发表于 2020-4-15 09:39
void print(List L)//打印链表
{ L=L->next;
int i;
谢谢,应该是L,但还是有问题{:10_243:} ly落叶 发表于 2020-4-15 10:36
都是一些语法错误和不够细心的问题。。。
谢谢纠正我这么多错误,可改了后还是在vc++上运行不了,不知能否麻烦给我解释一下,十分感谢 1298150336 发表于 2020-4-15 22:18
谢谢纠正我这么多错误,可改了后还是在vc++上运行不了,不知能否麻烦给我解释一下,十分感谢
是不是scanf_s的报错?我是在VS上运行的,老版VC的话应该直接用scanf就行 ly落叶 发表于 2020-4-21 10:43
是不是scanf_s的报错?我是在VS上运行的,老版VC的话应该直接用scanf就行
问题已经解决了,十分感谢,不过我想问一下为什么swap不用二级指针照样改变了实参呢?? 1298150336 发表于 2020-4-21 15:55
问题已经解决了,十分感谢,不过我想问一下为什么swap不用二级指针照样改变了实参呢??
因为节点都是以指针形式链接过去的,传入的形参L中保存了下个节点的next指针,所以交换时操作的仍然是之前的内存 ly落叶 发表于 2020-4-25 21:11
因为节点都是以指针形式链接过去的,传入的形参L中保存了下个节点的next指针,所以交换时操作的仍然是之 ...
谢谢
页:
[1]