鱼C论坛

 找回密码
 立即注册
查看: 744|回复: 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
都是一些语法错误和不够细心的问题。。。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>


  4. struct Node {
  5.         int data;
  6.         struct Node *next;
  7. };
  8. typedef struct Node *List;


  9. List Creat();
  10. List Creat()//创建单链表
  11. {
  12.         int i, n;
  13.         printf("请输入链表的长度:");
  14.         scanf_s("%d", &n);
  15.         List L = (List)malloc(sizeof(struct Node));
  16.         List Head = L;
  17.         if (!L)
  18.                 return NULL;
  19.         L->next = NULL;
  20.         srand(time(0));
  21.         for (i = 0; i < n; i++)
  22.         {
  23.                 List p = (List)malloc(sizeof(List));
  24.                 if (!p)
  25.                         return NULL;
  26.                 p->data = rand() % 100 + 1;
  27.                 p->next = NULL;
  28.                 L->next = p;
  29.                 L = p;
  30.         }
  31.         return Head; //返回值一般为头节点,而不是尾节点
  32. }

  33. void swap(List L, int n);
  34. void swap(List L, int n)/*交换是当前位置和后面一个位置交换*/
  35. {
  36.         int i;
  37.         for (i = 1; i < n; i++)
  38.                 L = L->next;
  39.         if (L->next == NULL)   // =赋值,应该是逻辑等于==
  40.         {
  41.                 printf("错误输入\n");
  42.                 return;
  43.         }
  44.         List L1, L2;
  45.         L1 = L->next;
  46.         L2 = L1->next;


  47.         L1->next = L2->next;
  48.         L->next = L2;
  49.         L2->next = L1;
  50. }
  51. //} //多了个括号。。。

  52. void print(List L);
  53. void print(List L)//打印链表
  54. {
  55.         L = L->next;
  56.         int i;
  57.         for (i = 0; L != NULL; i++)
  58.         {
  59.                 printf("%d\t", L->data); //p不知道从哪来的,逻辑上看应该是L
  60.                 L = L->next;
  61.         }
  62.         printf("\n");
  63. }

  64. int main()
  65. {
  66.         List L;
  67.         L = Creat();
  68.         print(L);
  69.         int n;
  70.         printf("请输入交换的元素于链表所在位置:");
  71.         scanf_s("%d", &n);
  72.         swap(L, n);//这里是不是应该传入地址???
  73.         printf("交换后:");
  74.         print(L);
  75.         return 0;
  76. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层    本楼为最佳答案   
都是一些语法错误和不够细心的问题。。。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>


  4. struct Node {
  5.         int data;
  6.         struct Node *next;
  7. };
  8. typedef struct Node *List;


  9. List Creat();
  10. List Creat()//创建单链表
  11. {
  12.         int i, n;
  13.         printf("请输入链表的长度:");
  14.         scanf_s("%d", &n);
  15.         List L = (List)malloc(sizeof(struct Node));
  16.         List Head = L;
  17.         if (!L)
  18.                 return NULL;
  19.         L->next = NULL;
  20.         srand(time(0));
  21.         for (i = 0; i < n; i++)
  22.         {
  23.                 List p = (List)malloc(sizeof(List));
  24.                 if (!p)
  25.                         return NULL;
  26.                 p->data = rand() % 100 + 1;
  27.                 p->next = NULL;
  28.                 L->next = p;
  29.                 L = p;
  30.         }
  31.         return Head; //返回值一般为头节点,而不是尾节点
  32. }

  33. void swap(List L, int n);
  34. void swap(List L, int n)/*交换是当前位置和后面一个位置交换*/
  35. {
  36.         int i;
  37.         for (i = 1; i < n; i++)
  38.                 L = L->next;
  39.         if (L->next == NULL)   // =赋值,应该是逻辑等于==
  40.         {
  41.                 printf("错误输入\n");
  42.                 return;
  43.         }
  44.         List L1, L2;
  45.         L1 = L->next;
  46.         L2 = L1->next;


  47.         L1->next = L2->next;
  48.         L->next = L2;
  49.         L2->next = L1;
  50. }
  51. //} //多了个括号。。。

  52. void print(List L);
  53. void print(List L)//打印链表
  54. {
  55.         L = L->next;
  56.         int i;
  57.         for (i = 0; L != NULL; i++)
  58.         {
  59.                 printf("%d\t", L->data); //p不知道从哪来的,逻辑上看应该是L
  60.                 L = L->next;
  61.         }
  62.         printf("\n");
  63. }

  64. int main()
  65. {
  66.         List L;
  67.         L = Creat();
  68.         print(L);
  69.         int n;
  70.         printf("请输入交换的元素于链表所在位置:");
  71.         scanf_s("%d", &n);
  72.         swap(L, n);//这里是不是应该传入地址???
  73.         printf("交换后:");
  74.         print(L);
  75.         return 0;
  76. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> 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-5-4 02:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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