猫喵鱼 发表于 2022-3-18 20:33:21

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

#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 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';
         }
          }
         }
}

猫喵鱼 发表于 2022-3-19 12:05:02

本帖最后由 猫喵鱼 于 2022-3-19 12:07 编辑

大马强 发表于 2022-3-19 08:34
问题出现在你这头插法不对,在哪个CreateListL函数中[/

猫喵鱼 发表于 2022-3-19 12:08:37

猫喵鱼 发表于 2022-3-19 12:05
大马强 发表于 2022-3-19 08:34
问题出现在你这头插法不对,在哪个CreateListL函数中[/

所以大神你这是头插还是尾插?

大马强 发表于 2022-3-19 20:38:18

我这是尾插法
页: [1]
查看完整版本: 为什么我按照书本打的单链表的代码,结果在输出后的链表是空白的?