鱼C论坛

 找回密码
 立即注册
查看: 1717|回复: 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
我这是尾插法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-19 08:34:35 | 显示全部楼层
问题出现在你这头插法不对,在哪个CreateListL函数中
#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->next = s; // 头插法这出现问题 
    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';
           }
          }
         }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

[quote]大马强 发表于 2022-3-19 08:34
问题出现在你这头插法不对,在哪个CreateListL函数中[/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

所以大神你这是头插还是尾插?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-19 20:38:18 | 显示全部楼层    本楼为最佳答案   
我这是尾插法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 21:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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