怎么将链表首尾连接?
struct SUN{
int num;
struct SUN* next;
};
void Pint(struct SUN* head)
{
struct SUN* temp;
temp = head;
while (temp != NULL)
{
printf("%d", temp->num);
temp = temp->next;
}
}
void add(struct SUN** head, int num)
{
struct SUN* space, * temp;
space = (struct SUN*)malloc(sizeof(struct SUN));
space->num = num;
temp = *head;
*head = space;
space->next = temp;
if (space->next != NULL)
{
printf("空间满了\n");
}
else
{
space->next = *head;
}
}
int main()
{
int num;
struct SUN* head = NULL;//链头
printf("input num:");
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
add(&head, i);
}
Pint(head);//若循环num ~ 0 则成功连接
return 0;
} 1187520285 发表于 2022-5-23 18:18
谢谢各位大佬帮我解决,我找到问题了,其实一开始就是想找个连接链头链尾的方法而已,代码也只是一部分不完整,我出问题在NULL,每次返回指向NULL指针的地址,将他跟链头连接起来,而忘记指向NULL的指针就是0,没有地址,所以没有连起来 本帖最后由 傻眼貓咪 于 2022-5-23 17:43 编辑
我的思路:
第一次赋值:
头指针赋值后,next 指向自己便可。
接下来的赋值:
赋值函数,先传入头指针
头指针 -> 指针 A -> ............ -> 尾指针 -> 头指针
设新指针 p,将值赋值于 p
将 p 指向头指针->next(如上,也就是指针 A)
将头指针->next 指向 p
示例:头指针 -> p -> 指针 A -> ............ -> 尾指针 -> 头指针
#include <stdio.h>
#include <malloc.h>
typedef struct Node {
int data;
struct Node* next;
}LinkedList;
void insert(LinkedList** head, int data) {
if (!(*head)) {
(*head) = (LinkedList*)malloc(sizeof(LinkedList));
if (*head) {
(*head)->data = data;
(*head)->next = (*head);
}
}
else {
LinkedList* p = (LinkedList*)malloc(sizeof(LinkedList));
if (p) {
p->data = data;
p->next = (*head)->next;
(*head)->next = p;
}
}
}
void freeAll(LinkedList** head) {
LinkedList* p, * q = (*head);
if (*head) {
p = (*head);
(*head) = (*head)->next;
free(p);
}while (q != head);
free(head);
}
void print(LinkedList* head) {
LinkedList* p = head;
if (head) {
do {
head = head->next;
printf("%d ", head->data);
} while (p != head);
}
}
int main(void) {
int arr[] = { 7, 14, 21, 28, 35 };
LinkedList* head = NULL;
for (int i = 0; i < 5; ++i) {
insert(&head, arr);
}
print(head);
freeAll(&head);
return 0;
} 要不看看这个:https://blog.csdn.net/qq_58190943/article/details/119079769
豆嘉木 发表于 2022-5-23 15:24
要不看看这个:https://blog.csdn.net/qq_58190943/article/details/119079769
主要是我想知道我错哪了 是想构建循环单链表吗 1187520285 发表于 2022-5-23 15:27
主要是我想知道我错哪了
调试别人的代码 是最难的,根本就看不懂你的思路
你是构建无头节点链表吗?
if (space->next != NULL) 你从来都没指定NULL这个if 岂不是永远成立
{
printf("空间满了\n");
}
PS D:\wp> ./ct6
input num:5
空间满了
空间满了
空间满了
空间满了
4 wp231957 发表于 2022-5-23 15:46
调试别人的代码 是最难的,根本就看不懂你的思路
你是构建无头节点链表吗?
if (space->next != NULL)...
这个if是为了找出尾节点,顺便打印下开辟了多少节点而已无其他意思!
1187520285 发表于 2022-5-23 15:50
这个if是为了找出尾节点,顺便打印下开辟了多少节点而已无其他意思!
问题是你找得到吗?
如果是尾插法,你需要自己设置NULL
如果是头插法,你也需要自己设置NULL
而我就没看到你设置NULL也没看明白你是有头链表还是无头链表是头插法还是尾插法 本帖最后由 jhq999 于 2022-5-23 16:08 编辑
void add(struct SUN** head, int num)
{
struct SUN* space, * temp;
space = (struct SUN*)malloc(sizeof(struct SUN));
space->num = num;
if(*head==NULL)*head=space,space->next=*head;////////
temp = *head;//////
while(temp->next!=*head)temp=temp->next;///////////////////楼上说的无头节点的头插法
temp->next=space;//////////////////
space->next = *head;////////
*head = space;/////////
/* if (space->next != NULL)
{
printf("空间满了\n");
}
else
{
space->next = *head;
}*/
} 如果你要用头插法,还不带头节点,那就必须添加一个尾指针,每次添加节点时都要调整尾部节点指向新节点 #include <stdio.h>
#include <stdlib.h>
struct SUN {
int num;
struct SUN *next;
};
void Pint(struct SUN *head) {
struct SUN *temp;
temp = head;
do {
printf("%d", temp->num);
temp = temp->next;
} while(temp != head);
#if 0
while(temp != NULL) {
printf("%d", temp->num);
temp = temp->next;
}
#endif
}
void add(struct SUN **head, int num) {
//struct SUN *space, *temp;
//space = (struct SUN *)malloc(sizeof(struct SUN));
struct SUN *space = malloc(sizeof(struct SUN));
space->num = num;
if(!*head) {
space->next = space;
*head = space;
return;
}
struct SUN *prev = (*head)->next;
while(prev->next != *head) prev = prev->next;
space->next = prev->next;
prev->next = space;
#if 0
temp = *head;
*head = space;
space->next = temp;
if(space->next != NULL) {
printf("空间满了\n");
} else {
space->next = *head;
}
#endif
}
void free_list(struct SUN *head) {
struct SUN *current = head, *temp;
do {
temp = current;
current = current->next;
free(temp);
} while(current != head);
}
int main(void) {
int num;
struct SUN *head = NULL; //链头
printf("input num:");
scanf("%d", &num);
for(int i = 0; i < num; i++) {
add(&head, i);
}
Pint(head); //若循环num ~ 0 则成功连接
free_list(head);
puts("");
return 0;
}
void link(struct SUN *head)
{
struct SUN* temp;
temp = head->next;
while (temp->next != NULL)
{
printf("2\n");
temp = temp->next;
}
temp->next = head;
} 傻眼貓咪 发表于 2022-5-23 17:39
我的思路:
第一次赋值:
虽然问题我找到了,也谢谢你,你字多给你了 循环链表吗?
页:
[1]