weier 发表于 2020-2-19 16:15:03

链表方面的问题,需要实现一些功能,程序实现不了,求大佬给点提示

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0

typedef int Elemtype;
typedef struct node
{
    int data;
    struct node *next;
}node;

void mianban()//提示信息
{
    printf("选择执行下列操作:\n");
    printf("1.建立线性链表;\n");
    printf("2.显示链表;\n");
    printf("3.插入一个结点;\n");
    printf("4.删除一个结点;\n");
    printf("5.查询结点数据;\n");
    printf("6.查询数据结点;\n");
}

int CreateList(node *L,Elemtype e)//建立链表
{
    node *s;
    L=(node*)malloc(sizeof(node));
    if(!L)
    {
      return ERROR;
    }
    L->next=NULL;
    while(e)
    {
      s=(node*)malloc(sizeof(node));
      if(!s)
      {
            return ERROR;
      }
      s->data=e;
      s->next=L->next;
      L->next=s;
      scanf("%d",&e);
    }
    return L;
}

int ListLength(node *L)   //计算链表长度
{
    node *p;
    int i=0;
    p=L->next;
    while(p!=NULL)
    {
      p=p->next;
      i++;
    }
    return i;
}

void ListInsert(node *L,int i,Elemtype e)   //链表插入节点
{
    node *p,*s;
    int n,L_length;
    p=L;
    L_length=ListLength(L);
    if(i>0&&i<=L_length+1)
    {
      for(n=0;n<i-1;i++)
      {
            p=p->next;
      }
      s=(node*)malloc(sizeof(node));
      if(!s)
      {
            return ERROR;
      }
      s->data=e;
      s->next=p->next;
      p->next=s;
    }
    else
      return ERROR;
}

void ListDelete(node *L,int i)//链表删除节点
{
    node *p,*s;
    int n,L_length;
    p=L;
    L_length=ListLength(L);
    if(i>0&&i<=L_length)
    {
      for(n=0;n<i-1;i++)
      {
            p=p->next;
      }
      s=p->next;
      p->next=s->next;
      free(s);
    }
}

int GetElem(node *L,int i,Elemtype *e)//查询链表结点并返回数据
{
    node *p;
    int n,L_length;
    p=L;
    L_length=ListLength(L);
    if(i>0&&i<=L_length)
    {
      for(n=0;n<i;i++)
      {
            p=p->next;
      }
      e=p->data;
    }
    return e;
}

void ClearList(node *L)   //清空链表
{
    node *p,*s;
    int i,L_length;
    L_length=ListLength(L);
    p=L;
    for(i=0;i<L_length;i++)
    {
      s=p->next;
      p->next=s->next;
      free(s);
    }
}

int LocateElem(node *L,Elemtype e,int n)    //查询结点在第几位
{
    node *p,*s;
    int i;
    int L_length=ListLength(L);
    if(L->next==NULL)
    {
      return ERROR;
    }
    p=L->next;s=L;
    for(i=1;p->data!=e&&i<=L_length;i++)
    {
      p=p->next;
      s=s->next;
    }
    if(s->data!=e&&i==L_length)
    {
      i=0;
    }
    return i;
}

void XsList(node *L)    //显示链表
{
    int i;
    node *p;
    p=L->next;
    while(p->next!=NULL)
    {
      printf("%d->",p->data);
      p=p->next;
    }
    printf("%d",p->data);
}

int main()
{
    int e,i,n;
    int *m;
    node *L;
    while(1)
    {
      printf("\n");
      mianban();
      printf("\n");
      scanf("%d",&n);
      switch(n)
      {
      case 1:
            scanf("%d",&e);
            CreateList(L,e);
            XsList(L);
            break;
      case 2:
            XsList(L);
            break;
      case 3:
            scanf("%d",&i);
            scanf("%d",&e);
            ListInsert(L,i,e);
            XsList(L);
            break;
      case 4:
            scanf("%d",&i);
            ListDelete(L,i);
            XsList(L);
            break;
      case 5:
            scanf("%d",i);
            GetElem(L,i,*m);
            printf("%d",m);
            break;
      case 6:
            scanf("%d",i);
            LocateElem(L,i,e);
            printf("%d",e);
            break;
      }
    }

    return 0;
}
调试的时候发现问题基本上出现在p->next,L->next上,可能是指针方面的问题,求大佬们指点!!!

zhaopengfei 发表于 2020-3-7 08:54:53

连具体的问题都不描述一下,有什么需要指点的呢?
页: [1]
查看完整版本: 链表方面的问题,需要实现一些功能,程序实现不了,求大佬给点提示