标题:链表不知道哪儿错了??调不来!求帮忙!
取消只看楼主
程火山
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-5-3
结帖率:25%
 问题点数:0 回复次数:2 
链表不知道哪儿错了??调不来!求帮忙!
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

    //Status 为函数的类型,其值是函数结果状态代码,如OK等
typedef int Status;

    // ElemType为数据元素类型,根据实际情况而定,这里假设为int
typedef int ElemType;

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define num 10

 
struct LNode               /* 结点定义 */     
 {
   int data;
   struct LNode *next;
 };


struct LNode *creatlink();

Status ListLength(struct LNode *h);                       //(1)求表的长度函数

Status GetElem(struct LNode *L,int i,ElemType *e);        //(2)取表中的一个元素函数GetElem( L,i,&e)

void  ListInsert(struct LNode *L,int i,ElemType e);            //(4)在表中插入一个元素函数 ListInsert(&L,i,e)

Status ListEmpty(struct LNode *L);                        //(5)判断表是否空函数ListEmpty(L)

void ListDelet(struct LNode *L,int i,ElemType *e);                 //(6)删除表中数据函数ListDelete(&L,i,&e)

void print(struct LNode *h);

int main()
{
 
    int n, e=0,s,i;

    struct LNode *LinkList; /* 表的头指针类型 */

    printf("\n创建链表为:  \n");

    LinkList=creatlink();

    print(LinkList);

    n=ListLength(LinkList);

    printf("\n链表的长度:%d\n",n);

    printf("\n取表中的一个数:");

    scanf("%d",&i);
   
    s=GetElem(LinkList,i,&e);

    if(s==1)
        printf("\n存在   ");
    else
        printf("\n不存在 : ");

    ListInsert(&LinkList,i,e);

    print(LinkList);

    ListDelet(&LinkList,i,&e);

   
    print(LinkList);

    s=ListEmpty(LinkList);

    printf("\n空表即是1,不是空表即是0  :  %d\n",s);
   
    printf("\n");

    print(LinkList);

    return 0;
}

struct LNode *creatlink()
{
    int n;
   
    struct LNode *p,*q,*h;

    h=p=q=(struct LNode *)malloc(sizeof(struct LNode));

    h=NULL;
   
    for(n=0 ;  n<num  ; n++)
    {
        if(n == 0)
        {
            p->data=n;
            h=p;
        }
        else
            q->next=p;
        q=p;
        p=(struct LNode *)malloc(sizeof(struct LNode));
        p->data=n+1;
    }
    q->next =NULL;

    return h;

}

Status ListLength(struct LNode *h)  // 1
{
    int n=0;
    while(h!=NULL)
    {
        n++;
        h = h -> next;
    }
    return n;
}

void print(struct LNode *h)
{
    while(h!=NULL)
    {
        printf("%d —> ",h->data);
        h = h -> next;
    }
    puts("NULL");
}


Status GetElem(struct LNode *L,int i,ElemType *e)  // 2
 {
                                    /* L为单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
   int j=1;                            /* j为计数器 */
   struct LNode *p=L;                /* p指向第一个结点 */
   while(p&&j<i)                /* 顺指针向后查找, 直到p指向第i个元素 或p为空 */
   {
     p=p->next;
     j++;
   }        
   if(!p||j>i)                     /* 第i个元素不存在 */
     return ERROR;
   *e=p->data;                 /* 取第i个元素 */
   return OK;
 }


Status ListEmpty(struct LNode *L)                //5
{                                /* 初始条件:链式存储的表L已存在。*/
                                /*操作结果:若L为空表,则返回TRUE,否则返回FALSE */
    if(L->next)
            return FALSE;
    else
            return TRUE;
}

//Status LocateElemLocateElem(struct LNode *L,ElemType *e,compare( ));

void ListInsert(struct LNode *L,int i,ElemType e)         //4
{
    int m=0;
    struct LNode *p,*q;
    p=(struct LNode *)malloc(sizeof(struct LNode));
    p->data = e;
    q=L;
    while( m < i )
    {
        q=q->next;
        m++;
    }
    p->next=p->next ;
    q->next = p;
}

void ListDelet(struct LNode *L,int i,ElemType *e)  //6 删除L的第i个数据元素,并用e返回其值,
{

    int m=0;
    struct LNode *p,*q;
    p=L;
    while( m < i )
    {
        q=p;
        p=p->next;
        m++;
    }
    *e=p->data;
    q->next=p->next ;
    free(p);
}

[此贴子已经被作者于2017-5-22 14:54编辑过]

搜索更多相关主题的帖子: include 元素 
2017-05-22 14:43
程火山
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-5-3
得分:0 


[此贴子已经被作者于2017-5-22 14:56编辑过]

2017-05-22 14:44
程火山
Rank: 1
等 级:新手上路
帖 子:19
专家分:0
注 册:2017-5-3
得分:0 
真的感谢!!

void ListInsert(struct LNode *L,int i,ElemType e)         //4
{
    int m=0;
    struct LNode *p, *p1,*q;
    p=(struct LNode *)malloc(sizeof(struct LNode));
    p->data = e;
    q=L;
    while( m < i )
    {

        q=q->next;
        m++;
    }
    p1 = q->next;           //这里有问题, 要建立指针来保存找到的下一个地址   
    q->next = p;
    p->next = p1;

}
 p->next=p->next ;
    q->next = p;






void ListInsert(struct LNode *L,int i,ElemType e)         //4
{
    int m=0;
    struct LNode *p,*q;
    p=(struct LNode *)malloc(sizeof(struct LNode));
    p->data = e;
    q=L;
    while( m < i )
    {
        q=q->next;
        m++;
    }
    p->next=p->next ;   这里写错了  发现了  应该是 p->next=q->next!!
    q->next = p;
}
这样就对了
2017-05-23 01:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-477223-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.162168 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved