关于#c语言数据结构链表#的问题,请各位专家解答!

#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代码。
修改后运行结果:

img

代码:

#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格式返回。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632