#include<stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, * LinkList;
int initlist(LinkList L)
{
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
}
int creatlist(LinkList L,int n)
{
int j;
LinkList p;
for(j=n;j>0;j--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
L->next=p;
p->next=NULL;
L=L->next;
}
return 1;
}
void printlist(LinkList L)
{
LinkList t=L->next;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;
}
printf("NULL\n");
}
int getelem(LinkList L,int i,int *e)
{
int j;
LinkList s=L;
for(j=0;j<i;j++)
{
s=s->next;
}
if(s==NULL) return 0;
*e=s->data;
printf("%d ",*e);
return 1;
}
int insertelem(LinkList L,int i,int e)
{
LinkList p=L->next;
LinkList q;
int j;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
printf("%d ",q->data);
}
int deletelem(LinkList L,int i,int *e)
{
int j;
LinkList p=L->next;
LinkList q;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
*e=q->data;
p->next=q->next;
return 1;
}
int main()
{
LinkList L;
int n,e,t;
initlist(L);
scanf("%d",&n);
creatlist(L,n);
getelem(L,1,&e);
printlist(L);
insertelem(L,2,10);
printlist(L);
deletelem(L,3,&t);
printlist(L);
return 0;
}
问题:程序只能输入但其他功能运行不了
代码修改了一下,为便于查看,在代码中加了一些打印提示,如果不需要可修改一下printf代码。
修改后运行结果:
代码:
#include<stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
int initlist(LinkList *L)
{
(*L) = (LinkList)malloc(sizeof(LNode));
(*L)->next = NULL;
return 1;
}
int creatlist(LinkList L, int n)
{
int j;
LinkList p;
for (j = n; j > 0; j--)
{
p = (LinkList)malloc(sizeof(LNode));
scanf("%d", &p->data);
L->next = p;
p->next = NULL;
L = L->next;
}
return 1;
}
void printlist(LinkList L)
{
LinkList t = L->next;
while (t != NULL)
{
printf("%d ", t->data);
t = t->next;
}
printf("\n"); //printf("NULL\n");
}
int getelem(LinkList L, int i, int* e)
{
int j;
LinkList s = L;
for (j = 0; j < i; j++)
{
s = s->next;
}
if (s == NULL) return 0;
*e = s->data;
printf("获取第%d个数据:%d\n",i, *e);
return 1;
}
int insertelem(LinkList L, int i, int e)
{
LinkList p = L->next;
LinkList q;
int j = 1;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
q = (LinkList)malloc(sizeof(LNode));
q->data = e;
q->next = p->next;
p->next = q;
printf("第%d位置插入数据:%d\n", i,q->data);
return 1;
}
int deletelem(LinkList L, int i, int* e)
{
int j = 1;//修改
LinkList p = L->next;
LinkList q;
while (p != NULL && j < i - 1)
{
p = p->next;
j++;
}
if (p)
{
q = p->next;
*e = q->data;
p->next = q->next;
printf("删除第%d个元素:%d\n", i, *e);
return 1;
}
return 0;
}
int main()
{
LinkList L;
int n, e, t;
initlist(&L);
scanf("%d", &n);
creatlist(L, n);
getelem(L, 1, &e);
printlist(L);
insertelem(L, 2, 10);
printlist(L);
deletelem(L, 3, &t);
printlist(L);
return 0;
}
initlist(L);要传L的指针。,函数中对L赋值带不出函数,最后是L没有初始化。
【以下回答由 GPT 生成】
问题根本原因在于在initlist函数和creatlist函数中,传入的参数是按值传递,所以在函数内部对L进行修改不会对外部产生影响。为了解决这个问题,可以将传入参数改为指向指针的指针。
优化后的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode, * LinkList;
/*
* 初始化链表
*/
int initlist(LinkList *L)
{
*L=(LinkList)malloc(sizeof(LNode));
(*L)->next=NULL;
}
/*
* 创建链表
*/
int creatlist(LinkList *L,int n)
{
int j;
LinkList p;
for(j=n;j>0;j--)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
(*L)->next=p;
p->next=NULL;
*L=(*L)->next;
}
return 1;
}
/*
* 打印链表
*/
void printlist(LinkList L)
{
LinkList t=L->next;
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;
}
printf("NULL\n");
}
/*
* 获取链表指定位置的元素
*/
int getelem(LinkList L,int i,int *e)
{
int j;
LinkList s=L;
for(j=0;j<i;j++)
{
s=s->next;
}
if(s==NULL) return 0;
*e=s->data;
printf("%d ",*e);
return 1;
}
/*
* 在链表指定位置插入元素
*/
int insertelem(LinkList L,int i,int e)
{
LinkList p=L->next;
LinkList q;
int j;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
q=(LinkList)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
printf("%d ",q->data);
}
/*
* 删除链表指定位置的元素
*/
int deletelem(LinkList L,int i,int *e)
{
int j;
LinkList p=L->next;
LinkList q;
while(p!=NULL&&j<i-1)
{
p=p->next;
j++;
}
q=p->next;
*e=q->data;
p->next=q->next;
return 1;
}
int main()
{
LinkList L;
int n,e,t;
initlist(&L);
printf("请输入链表元素的个数: ");
scanf("%d",&n);
creatlist(&L,n);
printf("链表第一个元素为: ");
getelem(L,1,&e);
printf("\n链表的所有元素为: ");
printlist(L);
printf("\n在链表第二个位置插入元素10后,链表的元素为: ");
insertelem(L,2,10);
printlist(L);
printf("删除链表第三个位置的元素后,链表的元素为: ");
deletelem(L,3,&t);
printlist(L);
return 0;
}
答案用markdown格式返回。
【相关推荐】