#include<stdio.h>
#include<malloc.h>
typedef struct node
{
struct node *next;
int *data;
}LinkList;
void createListHead(LinkList *L,int n)
{
int i;
LinkList *head,*s;
head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
for(i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->next = head->next;
head->next=s;
scanf("%d",s->data);
}
}
void printLinkList(LinkList *L)
{
LinkList * q;
q = (LinkList*)malloc(sizeof(LinkList));
q = L->next;
while(q!=NULL)
{
printf("%d",*(q->data)); //*(q.date) is equivalent with q->data or not?
q=q->next;
}
}
int main()
{
int n;
LinkList *L;
printf("请输入你想创建的链表长度:");
scanf("%d",&n);
printf("请输入链表的数据:");
createListHead(L,n);
printLinkList(L);
return 0;
}
修改如下,改动处见注释,供参考:
#include<stdio.h>
#include<malloc.h>
typedef struct node
{
struct node* next;
int data; //int* data; 修改
}LinkList;
void createListHead(LinkList** L, int n) // 修改
//void createListHead(LinkList* L, int n)
{
int i;
LinkList* head , * s;
head = (LinkList*)malloc(sizeof(LinkList));
head->next = NULL;
(*L) = head; // 修改
for (i = 0; i < n; i++)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->next = head->next;
head->next = s;
scanf("%d", &s->data); //scanf("%d", s->data); 修改
}
}
void printLinkList(LinkList* L)
{
LinkList* q;
//q = (LinkList*)malloc(sizeof(LinkList)); 修改
q = L->next;
while (q != NULL)
{
printf(" %d", q->data); //*(q.date) is equivalent with q->data or not?
//printf("%d", *(q->data)); 修改
q = q->next;
}
}
int main()
{
int n;
LinkList* L;
printf("请输入你想创建的链表长度:");
scanf("%d", &n);
printf("请输入链表的数据:");
createListHead(&L, n); // 修改
//createListHead(L, n);
printLinkList(L);
return 0;
}
:s->data 并未指向一个可用的存储空间,也就是说并没有给s->data分配空间,调用scanf("%d",s->data); 的时候可能出现异常了。
不知道你这个问题是否已经解决, 如果还没有解决的话:问题分析: 根据程序的描述和代码分析,发现可能存在以下问题: 1. 没有为链表的头节点L分配内存空间,导致在createListHead和printLinkList函数中对L进行操作时出现错误。 2. 在createListHead函数中,没有为链表节点的data域分配内存空间,导致在scanf函数中可能出现错误。 3. 在printLinkList函数中,没有为临时指针变量q分配内存空间,导致在对其进行赋值操作时出现错误。
解决方案:
针对以上问题,我会给出具体的解决方案和优化代码。
#include <stdio.h>
#include <stdlib.h> // 添加头文件,以使用malloc和free函数
typedef struct node
{
struct node *next;
int data; // 修改为int类型的data,不再使用int指针类型
} LinkList;
void createListHead(LinkList **L, int n) // 修改L为指向链表指针的指针
{
int i;
LinkList *head, *s;
head = (LinkList*)malloc(sizeof(LinkList)); // 为头节点分配内存空间
head->next = NULL;
for (i=0; i<n; i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->next = head->next;
head->next=s;
scanf("%d", &(s->data)); // 修改读取data的方式
}
*L = head; // 将头节点赋值给传入的指针变量L
}
void printLinkList(LinkList *L)
{
LinkList *q = L->next; // 去除不必要的内存分配,直接指向头节点的下一个节点
while (q!=NULL)
{
printf("%d ", q->data);
q=q->next;
}
printf("\n");
}
int main()
{
int n;
LinkList *L = NULL; // 初始化L为NULL
printf("请输入你想创建的链表长度:");
scanf("%d", &n);
printf("请输入链表的数据:");
createListHead(&L,n); // 修改为传入L的地址
printLinkList(L);
free(L); // 释放链表的内存空间
return 0;
}
通过以上的优化,解决了问题中的指针错误,并对程序进行了优化。其中: 1. 在createListHead函数中,对头节点L进行了动态内存分配,并进行了赋值操作。 2. 在createListHead函数中,修正了scanf函数中读取data的方式。 3. 在printLinkList函数中,去除了不必要的指针动态内存分配操作。 4. 在main函数中,初始化了L,并在程序结束前释放了链表的内存空间,防止内存泄漏。
请尝试使用优化后的代码运行,看看是否能够解决问题。