回 帖 发 新 帖 刷新版面

主题:[讨论]大伙帮我看看这个链表,谢谢拉

#include "stdio.h"
#include "stdlib.h"
#define FLAG -1

typedef struct node
{
  int data;
  struct node *next;
}Lnode,*Linklist;

Linklist Creat_LinkList()                    /*初始化链表, 从头部插入*/
{
  Linklist L=NULL;
  Lnode *s=NULL;
  int x;
  printf("please insert some nums :\n");
  scanf("%d",&x);
  while(x!=FLAG)
  {
    s=malloc(sizeof(Lnode));
    s->data=x;
    s->next=L;L=s;
    scanf("%d",&x);
  }
  printf("the linklist creat Success! \n");
  return L;
}

Linklist Creat_1LinkList()                    /*初始化链表,从尾部插入*/
{
  Linklist L=NULL;
  Lnode *r=NULL,*s=NULL;
  int x;
  printf("please insert some nums :\n");
  scanf("%d",&x);
  while(x!=FLAG)
  {
    s=malloc(sizeof(Lnode));
    s->data=x;
    if(L==NULL)
      L=s;
    else
      r->next=s;
    r=s;
    r->next=NULL;
    scanf("%d",&x);
  }
  printf("the linklist creat Success! \n");
  return L;
}
Lnode* Get_Linklist(Linklist L,int i)              /*按值 查找 i 为要查找的值 此函数结果返回其指针*/
{
  Lnode* p=L->next;                                /*这里不知道为什么,返回的指针p 为空*/
  while(p!=NULL&&p->data!=i)
  p=p->next;
  return p;
}
int Insert_Linklist(Linklist L,int i, int x)       /*插入一个新结点*/
{
  Lnode* p,*s;
  p=Get_Linklist(L,i-1);
  if(p==NULL)
  {printf("the num 'i' error!!");return 0;}
  else{
  s=malloc(sizeof(Lnode));
  s->data=x;
  s->next=p->next;
  p->next=s;
  return 1;
  }
}

main()
{
   Linklist L1=NULL,L2=NULL;  /*定义两个链表指针,L1是用于从头部插入建立链表,L2是从尾部插入建立新链表*/
   Lnode* s;
   int i,x,y;
   clrscr();       /*清屏*/

   printf("this is a linklist no headcrunode : \n");
   L1=Creat_LinkList();    /*返回从头部插入链表初始化函数指针*/
   while(L1!=NULL)
   {
      printf("%d-->",L1->data);
      L1=L1->next;
   }
   printf("\n");

   printf("this is a linklist with headcrunode :\n");
   L2=Creat_1LinkList();   /*返回从尾部插入链表初始化函数指针*/
   while(L2!=NULL)
   {
      printf("%d-->",L2->data);
      L2=L2->next;
   }
   printf("please input the num which you want to find:\n");
   scanf("%d",&i);         /*此输入需要查找的链表中的值  (按值查找)*/
   s=Get_Linklist(L2,i);   /*返回按值查找 返回的指针  ,问题也这里  */
   printf("%d\n",s->data); /*将你要查找的值 ,在输出,因为查找函数部分出现问题,这里总是输入0,应该是因为返回的指针p==NULL吧 */
   printf("please choose the location and the num you want to insert:\n");
   scanf("%d%d",&x,&y);    /*这是插入新结点的位置和 值 ,这部分还没调试,主要是想请大家帮我看看查找函数部分出现的问题*/
   Insert_Linklist(L2,x,y);
   printf("\n");
   getch();
}
就是查找函数部分出现问题,  帮帮忙拉  谢谢

回复列表 (共4个回复)

沙发

你这个地方有两个错误,第一个:
Lnode* Get_Linklist(Linklist L,int i)              /*按值 查找 i 为要查找的值 此函数结果返回其指针*/
{
  /*node* p=L->next;这里p不能指向L->next,因为你创建链表的时候就没把头指针给放进去,具体操作你的main()函数里输出链表元素的地方就可以看出来。所以这里应改成*/
  Lnode* p=L;
  while(p!=NULL&&p->data!=i)
  p=p->next;
  return p;
}
第二个错误:
在main()函数里,你已经经过
   L2=Creat_1LinkList();   /*返回从尾部插入链表初始化函数指针*/
   while(L2!=NULL)
   {
      printf("%d-->",L2->data);
      L2=L2->next;
   }
这个操作,L2已经指向了表尾空元素,然后你又要进行查找
s=Get_Linklist(L2,i);   因为这个时候L2指向的是NULL,所以结果就错了。
改正后的main()程序,我多加了一个变量指针temp:
main()
{
   Linklist L1=NULL,L2=NULL;  /*定义两个链表指针,L1是用于从头部插入建立链表,L2是从尾部插入建立新链表*/
   Lnode* s,*temp;
   int i,x,y;
   clrscr();       /*清屏*/

   printf("this is a linklist no headcrunode : \n");
   L1=Creat_LinkList();    /*返回从头部插入链表初始化函数指针*/
   temp=L1;//这样可以防止执行下面操作后改变L1指针,下面L2的也是一样
   while(temp!=NULL)
   {
      printf("%d-->",temp->data);
      temp=temp->next;
   }
   printf("\n");

   printf("this is a linklist with headcrunode :\n");
   L2=Creat_1LinkList();   /*返回从尾部插入链表初始化函数指针*/
   temp=L2;
   while(temp!=NULL)
   {
      printf("%d-->",temp->data);
      temp=temp->next;
   }
   printf("please input the num which you want to find:\n");
   scanf("%d",&i);         /*此输入需要查找的链表中的值  (按值查找)*/
   s=Get_Linklist(L2,i);   /*返回按值查找 返回的指针  ,问题也这里  */
   printf("%d\n",s->data);
  // printf("please choose the location and the num you want to insert:\n");
   //scanf("%d%d",&x,&y);    /*这是插入新结点的位置和 值 ,这部分还没调试,主要是想请大家帮我看看查找函数部分出现的问题*/
  // Insert_Linklist(L2,x,y);
   printf("\n");
   getch();
}

板凳

我的头部插入设有头结点 
   谢谢楼上大哥指点哈  ,我没注意  L使用后的指针指向NULL
呵呵,  改了下 设了个 TEMP果然好了呵

3 楼

不错

4 楼

你虽然设了头结点,但是没有把头结点的作用显示出来,相当于没有头结点

我来回复

您尚未登录,请登录后再回复。点此登录或注册