好好学C呀 2023-03-16 16:43 采纳率: 14.8%
浏览 26
已结题

数据结构链表的输出函数

为什么ListPrint函数输出的结果是这个?

img


#include"stdio.h"
#include<stdlib.h>
#define ERROR 0
#define OK 1
typedef int ElemType;  

typedef struct Node//结点类型定义 
{
    ElemType data;
    struct Node * next;
}Node, * LinkList;//LinkList为结构指针类型 

InitList (LinkList * L)//初始化单链表  
{
    *L=(LinkList)malloc(sizeof(Node));//建立头结点 
    (*L)->next=NULL;//建立空的单链表L 
} 

void CreateFromHead(LinkList L)//头插法逆序建表 
{
        Node * s;
        char c;
        int flag=1;
        while(flag)//flag初值为1,当输入"$"时,置flag为0,建表结束
        {
            c=getchar();
            if(c!='$')
                {
                    s=(Node*)malloc(sizeof(Node));//建立新结点S 
                    s->data=c;
                    s->next=L->next;//将S结点插入头结点 
                    L->next=s;
                }
            else flag=0;
        } 
} 

void CreateFromTail(LinkList L)//尾插法顺序建表
{
    char c;
    Node * r,* s;
    int flag=1;
    r=L;//r指针动态指向链表的当前表尾,以便于插入表尾,其初值指向头结点 
    while(flag)
    {
        c=getchar();
        if(c!=flag)
            {
                s=(Node*)malloc(sizeof(Node));
                s->data=c;
                r->next=s;
                r=s;    
            }
        else
            {
                flag=0;
                r->next=NULL;//将最后一个结点的next链域置为空,表示链表的结束 
            }    
    }
}

Node * Get(LinkList L,int i)//按序号查找 
{
    int j;
    Node * p;
    p=L->next;
    if(i<=0) return NULL;
    p=L;j=0;//从头结点开始扫描 
    while((p->next!=NULL)&&(j<i))
    {
        p=p->next;//扫描下一个结点 
        j++;//结点计数器 
    }
    if(i==j) return p;//找到了第i个结点 
    else return NULL;//找不到,,i<=0或i>n 
} 

Node * Locate(LinkList L,ElemType key)//按值查找
{
    Node * p;
    p=L->next;//从表中第一个结点开始 
    while(p!=NULL)//当前表未查完 
    {
        if(p->data!=key)
            {
                p=p->next;
            }
        else break;    //找到结点值=key时退出循环 
    }
    return p;
}

int ListLength(LinkList L)//求单链表的长度 
{
    int j;
    Node * p;
    p=L->next;
    j=0;//存放单链表的长度 
    while(p!=NULL)
    {
        p=p->next;
        j++;    
    }
    return j;    //j为求得的单链表长度    
}

int InsList(LinkList L,int i,ElemType e)//单链表插入操作 
{
    Node * pre,* s;
    int k;
    if(i<=0) return ERROR;
    pre=L;k=0;//从头结点开始,查找第i-1个结点 
    while(pre!=NULL&&k<i-1)//表未查完且未查到第i-1个时重复,找到pre指向第i-1个 
    {
        pre=pre->next;
        k=k+1;
    }
    if(pre==NULL)//pre为空,表已找完,但是未数到i-1个,说明插入位置不合理 
    {
        printf("插入位置不合理!");
        return ERROR;
    }
    s=(Node *)malloc(sizeof(Node));//申请新节点s 
    s->data=e;//值e置入s的数据域 
    s->next=pre->next;//修改指针,完成插入操作 
    pre->next=s;
    return OK;
}

int DelList(LinkList L,int i,ElemType *e)//单链表的删除操作 
{
    Node * pre,* r;
    int k;
    pre=L;k=0;
    while(pre->next!=NULL&&k<i-1)//寻找被删除结点i的前驱i-1使p指向它 
    {
        pre=pre->next;
        k=k+1;
    }
    if(pre->next==NULL)//没有找到合法的前驱位置 
    {
        printf("删除结点的位置i不合理!");
        return ERROR; 
    }
    r=pre->next;
    pre->next=r->next;//修改指针,删除结点r 
    *e=r->data;
    free(r);//释放被删除的结点所占的内存空间 
    return OK;
}

LinkList MergeLinkList(LinkList LA,LinkList LB)//合并两个有序的单链表 
{                                                //建议用尾插法来顺序建表 
    Node * pa,* pb,*r;
    LinkList LC;//将LC初始为空表 
    pa=LA->next;//pa指向LA表中的第一个结点 
    pb=LB->next;
    LC=LA;
    LC->next=NULL;r=LC;
    while(pa!=NULL&&pa!=NULL)//两表均未处理完,优先选择较小值结点插入LC 
    {
        if(pa->data<=pb->data)
        {
            r->next=pa;
            r=pa;
            pa=pa->next;
        }
        else
        {
            r->next=pb;
            r=pb;
            pb=pb->next;
        }
    }
    if(pa) r->next=pa;//若仅LA表未完 
    else r->next=pb;//否则 
    free(LB);
    return (LC);
}

void ListPrint(Node *L)
{
    Node *p=L->next;                      
    while (p->next != NULL)
    {
        printf("%d ", p->next->data);
        p = p->next;                     
    }
}

int main()
{
    LinkList L1,L2;
    InitList(&L1);InitList(&L2);
    int choose,i;
    int *e;
    for(i=0;i<9;i++)
    {
        printf("*********************************************\n");
                printf("*                    菜单                   *\n");
         printf("*    1:头插逆序建表       2:尾插顺序建表    *\n"); 
        printf("*    3:单链表插入         4:单链表删除      *\n");
        printf("*    5:按序号查找         6:按值查找        *\n");
        printf("*    7:求单链表长         8:合并有序链表    *\n");
        printf("*    7:单链表逆置         8:输出单链表      *\n");
        printf("*********************************************\n");
        printf("输入想要进行操作的序号:"); 
        scanf("%d",&choose);
        
        if(choose==1)
        {
            printf("头插法逆序建表L1(输入$结束):");
            printf("\n");
            CreateFromHead(L1);
            printf("当前单链表L1各元素为:");
            ListPrint(L1);
            printf("\n");
            printf("头插法逆序建表L2(输入$结束):");
            CreateFromHead(L2);
            printf("\n");
            printf("当前单链表L2各元素为:");
            ListPrint(L2);
        }
        if(choose==2)
        {
            printf("尾插法逆序建表L1(输入$结束):");
            CreateFromTail(L1);
            printf("当前单链表L1各元素为:");
            ListPrint(L1);
            printf("尾插法逆序建表L2(输入$结束):");
            CreateFromTail(L2);
            printf("当前单链表L2各元素为:");
            ListPrint(L2);    
        }
        if(choose=3)
        {
            
        } 
    }
    
}

  • 写回答

5条回答 默认 最新

  • 快乐鹦鹉 2023-03-16 16:49
    关注

    首先你的链表元素是int类型,但你输入用getchar(),导致输入的1被当做数字字符'1'接收,存储到int型就是数字'1'的ASCII码了。
    另外换行符也是字符啊,换行符的ASCII码是10,所以你最终输出的实际是输入的字符的ASCII码

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月18日
  • 已采纳回答 3月18日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看