鱼C论坛

 找回密码
 立即注册
查看: 2169|回复: 4

[已解决]为什么我按照书本打的单链表的代码,结果在输出后的链表是空白的?

[复制链接]
发表于 2022-3-18 20:33:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <malloc.h>
typedef int DataType;
typedef struct linknode
{

DataType data;
struct linknode *next;

}LinkList;

LinkList *InitList()
{
  LinkList *head;
  head=(LinkList*)malloc(sizeof(LinkList));
  head->next=NULL;
  return head;
}

void CreateListL(LinkList *head, int n)
{
LinkList  *s,*last;
int i;
last=head;
printf("请输入%d个整数: ",n);
for(i=0;i<n;i++)
{
        s=(LinkList*)malloc(sizeof(LinkList));
        scanf("%d",&s->data);
    s->next=NULL;
    last=s;
}
printf("建立链表操作成功!");
}

int LengthList(LinkList  *head)
{

LinkList *p=head->next;
int j=0;
while(p!=NULL)
{         p=p->next;
    j++;
}
    return j;
}


void Locate(LinkList *head,DataType x)
{
int j=1;
LinkList *p;
p=head->next;
while(p!=NULL && p->data!=x)
{ p=p->next;
j++;
}
if(p!=NULL)
printf("在表的第%d位找到值为%d的结点!",j,x);
else
printf("未找到值为%d的结点!",x);
}

void SearchList(LinkList *head,int i)
{

  LinkList *p;
  int j=0;
  p=head;
  if(i>LengthList(head))
  printf("位置错误,链表中没有该位置!");
  while(p->next!=NULL && j<i)
  {
          p=p->next;
      j++;
  }
if(j==i)

printf("在第%d位上的元素值为%d!",i,p->data);

}

void InsList(LinkList *head, int i,DataType x)
{
        int j=0;
    LinkList *p,*s;
    p=head;
  while(p->next!=NULL && j<i-1)
  {
  p=p->next;
  j++;
  }
if(p!=NULL)
{
        s=(LinkList*)malloc(sizeof(LinkList));
    s->data=x;
    s->next=p->next;
    p->next=s;
    printf("插入元素成功!");
}
else
printf("插入元素失败!");
}

void DelList(LinkList *head,int i)
{
  int j=0;
  DataType x;
  LinkList *p=head, *s;
  while(p->next!=NULL && j<i-1)
  {
          p=p->next;
   j++;
  }
if(p->next!=NULL && j==i-1)
{
   s=p->next;
   x=s->data;
   p->next=s->next;
   free(s);
   printf("删除第%d位上的元素%d成功!",i,x);
}
else
printf("删除结点位置错误,删除失败!");
}

void DispList(LinkList *head)
{

  LinkList *p;
  p=head->next;
  while(p!=NULL)
  {
          printf("%5d",p->data);
      p=p->next;
  }
}

void MenuLine()

{
        printf("\n\t\t       线性表子系统");
printf("\n\t\t\t| =============================");
printf("\n\t\t\t|        1——建立            |");
printf("\n\t\t\t|        2——插入            |");
printf("\n\t\t\t|        3——删除            |");
printf("\n\t\t\t|        4——按位置查找      |");
printf("\n\t\t\t|        5——按元素值查找    |");
printf("\n\t\t\t|        6——求表长          |");
printf("\n\t\t\t|        0——返回            |");
printf("\n\t\t\t|==============================");
printf("\n\t\t\t请输入菜单号(0-6): ");


}
main()
{
        LinkList *head;
   DataType x;
   int i,n;
   char ch1,ch2,a;
   ch1='y';
   while(ch1=='y'|| ch1=='y')
   {
           MenuLine();
   scanf("%c",&ch2);
   getchar();
   switch(ch2)
   {
    case'1':
       head=InitList();
       printf("请输入要建立线性表的长度:");
       scanf("%d",&n);
       CreateListL(head,n);
       printf("建立后的线性表为:\n");
       DispList(head);
       break;
        case'2':
       printf("请输入要插入的元素位置:");
       scanf("%d",&i);
       getchar();
       printf("请输入要插入的元素值:");
       scanf("%d",&x);
       InsList(head,i,x);
       printf("插入元素%d后的线性表:\n",x);
       DispList(head);
       break;
        case '3':
       printf("请输入要删除的元素位置:");
       scanf("%d",&i);
       DelList(head,i);
       printf("删除第%d位的元素后的线性表为:\n",i);
           DispList(head);
       break;
        case'4':
                printf("请输入查找的元素位置(大于等于1的整数):");
           scanf("%d",&i);
       SearchList(head,i);
       break;
        case'5':
       printf("请输入查找的整数:");
       scanf("%d",&x);
       Locate(head,x);
       break;
        case '6':
        printf("该线性表的长度为%d!",LengthList(head));
                break;
    case'0':
      ch1='n';
           break;
    default:
       printf("输入有误,请输入0-9进行选!");
   }
      if(ch2!='0')
          {
        printf("\n按回车键继续,按任意键返回主菜单!\n");
          a=getchar();
       if(a!='\xA')
           {
      getchar();ch1='n';
           }
          }
         }
}


最佳答案
2022-3-19 20:38:18
我这是尾插法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-19 08:34:35 | 显示全部楼层
问题出现在你这头插法不对,在哪个CreateListL函数中
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. typedef int DataType;
  4. typedef struct linknode
  5. {

  6. DataType data;
  7. struct linknode *next;

  8. }LinkList;

  9. LinkList *InitList()
  10. {
  11.   LinkList *head;
  12.   head=(LinkList*)malloc(sizeof(LinkList));
  13.   head->next=NULL;
  14.   return head;
  15. }

  16. void CreateListL(LinkList *head, int n)
  17. {
  18. LinkList  *s,*last;
  19. int i;
  20. last=head;
  21. printf("请输入%d个整数: ",n);
  22. for(i=0;i<n;i++)
  23. {
  24.         s=(LinkList*)malloc(sizeof(LinkList));
  25.         scanf("%d",&s->data);
  26.     s->next=NULL;
  27.     last->next = s; // 头插法这出现问题
  28.     last=s;
  29. }
  30. printf("建立链表操作成功!");
  31. }

  32. int LengthList(LinkList  *head)
  33. {

  34. LinkList *p=head->next;
  35. int j=0;
  36. while(p!=NULL)
  37. {         p=p->next;
  38.     j++;
  39. }
  40.     return j;
  41. }


  42. void Locate(LinkList *head,DataType x)
  43. {
  44. int j=1;
  45. LinkList *p;
  46. p=head->next;
  47. while(p!=NULL && p->data!=x)
  48. { p=p->next;
  49. j++;
  50. }
  51. if(p!=NULL)
  52. printf("在表的第%d位找到值为%d的结点!",j,x);
  53. else
  54. printf("未找到值为%d的结点!",x);
  55. }

  56. void SearchList(LinkList *head,int i)
  57. {

  58.   LinkList *p;
  59.   int j=0;
  60.   p=head;
  61.   if(i>LengthList(head))
  62.   printf("位置错误,链表中没有该位置!");
  63.   while(p->next!=NULL && j<i)
  64.   {
  65.           p=p->next;
  66.       j++;
  67.   }
  68. if(j==i)

  69. printf("在第%d位上的元素值为%d!",i,p->data);

  70. }

  71. void InsList(LinkList *head, int i,DataType x)
  72. {
  73.         int j=0;
  74.     LinkList *p,*s;
  75.     p=head;
  76.   while(p->next!=NULL && j<i-1)
  77.   {
  78.   p=p->next;
  79.   j++;
  80.   }
  81. if(p!=NULL)
  82. {
  83.         s=(LinkList*)malloc(sizeof(LinkList));
  84.     s->data=x;
  85.     s->next=p->next;
  86.     p->next=s;
  87.     printf("插入元素成功!");
  88. }
  89. else
  90. printf("插入元素失败!");
  91. }

  92. void DelList(LinkList *head,int i)
  93. {
  94.   int j=0;
  95.   DataType x;
  96.   LinkList *p=head, *s;
  97.   while(p->next!=NULL && j<i-1)
  98.   {
  99.           p=p->next;
  100.    j++;
  101.   }
  102. if(p->next!=NULL && j==i-1)
  103. {
  104.    s=p->next;
  105.    x=s->data;
  106.    p->next=s->next;
  107.    free(s);
  108.    printf("删除第%d位上的元素%d成功!",i,x);
  109. }
  110. else
  111. printf("删除结点位置错误,删除失败!");
  112. }

  113. void DispList(LinkList *head)
  114. {

  115.   LinkList *p;
  116.   p=head->next;
  117.   while(p!=NULL)
  118.   {
  119.       printf("%5d",p->data);
  120.       p=p->next;
  121.   }
  122. }

  123. void MenuLine()

  124. {
  125.         printf("\n\t\t       线性表子系统");
  126. printf("\n\t\t\t| =============================");
  127. printf("\n\t\t\t|        1——建立            |");
  128. printf("\n\t\t\t|        2——插入            |");
  129. printf("\n\t\t\t|        3——删除            |");
  130. printf("\n\t\t\t|        4——按位置查找      |");
  131. printf("\n\t\t\t|        5——按元素值查找    |");
  132. printf("\n\t\t\t|        6——求表长          |");
  133. printf("\n\t\t\t|        0——返回            |");
  134. printf("\n\t\t\t|==============================");
  135. printf("\n\t\t\t请输入菜单号(0-6): ");


  136. }
  137. main()
  138. {
  139.         LinkList *head;
  140.    DataType x;
  141.    int i,n;
  142.    char ch1,ch2,a;
  143.    ch1='y';
  144.    while(ch1=='y'|| ch1=='y')
  145.    {
  146.            MenuLine();
  147.    scanf("%c",&ch2);
  148.    getchar();
  149.    switch(ch2)
  150.    {
  151.     case'1':
  152.        head=InitList();
  153.        printf("请输入要建立线性表的长度:");
  154.        scanf("%d",&n);
  155.        CreateListL(head,n);
  156.        printf("建立后的线性表为:\n");
  157.        DispList(head);
  158.        break;
  159.         case'2':
  160.        printf("请输入要插入的元素位置:");
  161.        scanf("%d",&i);
  162.        getchar();
  163.        printf("请输入要插入的元素值:");
  164.        scanf("%d",&x);
  165.        InsList(head,i,x);
  166.        printf("插入元素%d后的线性表:\n",x);
  167.        DispList(head);
  168.        break;
  169.         case '3':
  170.        printf("请输入要删除的元素位置:");
  171.        scanf("%d",&i);
  172.        DelList(head,i);
  173.        printf("删除第%d位的元素后的线性表为:\n",i);
  174.            DispList(head);
  175.        break;
  176.         case'4':
  177.                 printf("请输入查找的元素位置(大于等于1的整数):");
  178.            scanf("%d",&i);
  179.        SearchList(head,i);
  180.        break;
  181.         case'5':
  182.        printf("请输入查找的整数:");
  183.        scanf("%d",&x);
  184.        Locate(head,x);
  185.        break;
  186.         case '6':
  187.         printf("该线性表的长度为%d!",LengthList(head));
  188.                 break;
  189.     case'0':
  190.       ch1='n';
  191.            break;
  192.     default:
  193.        printf("输入有误,请输入0-9进行选!");
  194.    }
  195.       if(ch2!='0')
  196.           {
  197.         printf("\n按回车键继续,按任意键返回主菜单!\n");
  198.           a=getchar();
  199.        if(a!='\xA')
  200.            {
  201.       getchar();ch1='n';
  202.            }
  203.           }
  204.          }
  205. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 12:05:02 | 显示全部楼层
本帖最后由 猫喵鱼 于 2022-3-19 12:07 编辑

[quote]大马强 发表于 2022-3-19 08:34
问题出现在你这头插法不对,在哪个CreateListL函数中[/
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-19 12:08:37 | 显示全部楼层
猫喵鱼 发表于 2022-3-19 12:05
[quote]大马强 发表于 2022-3-19 08:34
问题出现在你这头插法不对,在哪个CreateListL函数中[/

所以大神你这是头插还是尾插?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 20:38:18 | 显示全部楼层    本楼为最佳答案   
我这是尾插法
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表