链表输出
本帖最后由 焦糖橙子 于 2021-8-13 18:09 编辑目标:输出一个n*n的方阵,每一行,每一列的元素都不重复
例如3*3的方阵
123
231
312
输出的结果错了
想问一下45行的代码不能实现下次循环从链表的第二个数开始输出吗?
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node*next;
}node,*pnode;
pnode Create(int n);
pnode Create(int n)//创建一个1~n的循环链表,存储1~n的数据
{
pnode head=(pnode)malloc(sizeof(node));
pnode link=head;
head->next=link;
for(int i=0;i<n;i++)
{
link->next=(pnode)malloc(sizeof(node));
link->data=i+1;
link=link->next;
}
link->next=head;//尾巴的next指向头结点位置
return head;
}
int main(void)
{
int n;
pnode list;
printf("请输入一个n*n方阵:");
scanf("%d",&n);
list=Create(n);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%4d",list->data);
list=list->next;
}
list=list->next;//第二次从2开始输出,第三次从3输出,以此类推
putchar('\n');
}
return 0;
} 本帖最后由 焦糖橙子 于 2021-8-13 18:09 编辑
用了一个别的办法,不过输出变成了奇怪的数字。。。。
只有for循环变了点,如果能按照原来的思路改就最好。
不行的话帮我看看新的这个有什么问题{:10_266:}
int main(void)
{
int n;
pnode list;
pnode head;
printf("请输入一个n*n方阵:");
scanf("%d",&n);
head=Create(n);
list=head;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%4d",list->data);
list=list->next;
}
head=head->next;//保证每次从下一个结点开始循环
list=head;
putchar('\n');
}
return 0;
} for(int i=0;i<n;i++)
{
link->next=(pnode)malloc(sizeof(node));
link->data=i+1;
link=link->next;
}
link->next=head;//尾巴的next指向头结点位置
这段代码 构成的循环链表 有一个没有初始值的节点 如果输入n为4 你构成的循环列表是1->2->3->4->未初始节点->头部1 本来四个节点的循环链表你里面有了五个节点
这是我改的一种可以参考
for (int i = 0; i<n; i++)
{
link->next = (pnode)malloc(sizeof(node));
link->next->data = i + 1;
link = link->next;
}
link->next = head->next;//尾巴的next指向头结点位置 lei1996 发表于 2021-8-13 20:20
for(int i=0;inext=(pnode)malloc(sizeof(node));
link->data=i+1;
link=link->next;
我改好了,你的那个我跑出来还是多了一个节点,数值也是最后一个没有赋上
不过我知道你的意思了,我手动给最后一个赋值就行了
改成这样就ok
pnode Create(int n)
{
pnode head=(pnode)malloc(sizeof(node));
pnode link=head;
head->next=link;
for(int i=0;i<n-1;i++)
{
link->next=(pnode)malloc(sizeof(node));
link->data=i+1;
link=link->next;
}
link->data=n;
link->next=head;
return head;
}
对了少复制了一行就是
return head->next;
页:
[1]