2 sinat 24091517 sinat_24091517 于 2016.03.21 22:41 提问

一个c语言的链表问题,总是产生垃圾值,好几个指针错误找不到。

#include
#include
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

typedef int Status;

Status ListInsert_L(LinkList *L,int i,ElemType e)
{
LinkList p,s;
int j=0;
p=*L;
while(p&&j {
p=p->next;
++j;
}
if(!p||(j>i-1))return 0;
s=(LinkList)malloc(sizeof(LNode));
s->next=p->next;p->next=s;
s->data=e;
return 1;
}
Status ListDelete_L(LinkList *L,int i)
{
LinkList p,q;
int j;
p=*L;j=0;
while(p->next&&j {
p=p->next;++j;
}
if(!p->next||(j>i-1))return 0;
q=p->next;p->next=q->next;
free(q);
return 1;
}
void CreateList_L(LinkList *L,int n)
{
LinkList p,s;
p=*L;
for(n;n>0;--n)
{

int tmp;
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&tmp);
s->data=tmp;
s->next=p->next;p->next=s;
}
}

Status GetElem_L(LinkList L,int i,ElemType e)
{
LinkList p;int j;
p=L->next;j=1;
while(p&&j {
p=p->next;++j;
}
if(!p||j>i)return 0;
e=p->data;
return 1;
}
Status ListLenght_L(LinkList L)
{
int j=0;
LinkList p=L;
while(p->next)
{
j++;
}
return j;
}
Status LocateElem_L(LinkList *L,ElemType e,int *n/
,compare()*/)
{
LinkList p,s;
int j=0;
p=*L;
while(p->next)
{
p=p->next;++j;
if(p->data==e)
{
*n=j;return 1;break;
}
else return 0;
}
}
Status ListTraverse(LinkList *L)
{
LinkList p;
p=*L;
while(p->next)
{
printf("%d\t",p->data);
p=p->next;
}
}
void main()
{
LinkList L;
CreateList_L(&L,5);
ListTraverse(&L);
ListInsert_L(&L,4,8);
ListTraverse(&L);
ListDelete_L(&L,4);
ListTraverse(&L);
system("pause");
}


1个回答

caozhy
caozhy   Ds   Rxr 2016.03.21 23:36
已采纳

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

typedef int Status;

Status ListInsert_L(LinkList *L,int i,ElemType e)
{
    LinkList p,s;
    int j=0;
    p=*L;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||(j>i-1))return 0;
    s=(LinkList)malloc(sizeof(LNode));
    s->next=p->next;p->next=s;
    s->data=e;
    return 1;
}
Status ListDelete_L(LinkList *L,int i)
{
    LinkList p,q;
    int j;
    p=*L;j=0;
    while(p->next&&j<i-1)
    {
        p=p->next;++j;
    }
    if(!p->next||(j>i-1))return 0;
    q=p->next;p->next=q->next;
    free(q);
    return 1;
}
void CreateList_L(LinkList *L,int n)
{
    LinkList p,s;
    p=*L;
    for(n;n>0;--n)
    {   
        int tmp;
        s=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&tmp);
        s->data=tmp;
        s->next=p->next;p->next=s;
    }
}

Status GetElem_L(LinkList L,int i,ElemType *e)
{
    LinkList p;int j;
    p=L->next;j=1;
    while(p&&j<i)
    {
        p=p->next;++j;
    }
    if(!p||j>i)return 0;
    *e=p->data;
    return 1;
}
Status ListLenght_L(LinkList L)
{
    int j=0;
    LinkList p=L;
    while(p->next)
    {
        j++;
    }
    return j;
}
Status LocateElem_L(LinkList *L,ElemType e,int *n/*,compare()*/)
{
    LinkList p,s;
    int j=0;
    p=*L;
    while(p->next)
    {
        p=p->next;++j;
        if(p->data==e)
        {
            *n=j;return 1;break;
        }
        else return 0;
    }
}
Status ListTraverse(LinkList *L)
{
    LinkList p;
    p=*L;
    p=p->next;
    while(p)
    {
        printf("%d\t",p->data);
        p=p->next;
    }
    printf("\n");
    return 0;
}
void main()
{
    LinkList L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;
    CreateList_L(&L,5);
    ListTraverse(&L);
    ListInsert_L(&L,4,8);
    ListTraverse(&L);
    ListDelete_L(&L,4);
    ListTraverse(&L);
    system("pause");
}




sinat_24091517
sinat_24091517 回复caozhy: 看了你给我修改的明白了,对链表理解还不够。谢谢
一年多之前 回复
sinat_24091517
sinat_24091517 回复caozhy: 你测试一下我写的别的函数可以吗,我用vc编译没问题,一运行就卡死。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!