逆境。。。。 2022-09-25 15:08 采纳率: 80%
浏览 44
已结题

数据结构c语言单链表头插尾插问题

问题遇到的现象和发

麻烦帮看一下这里,为什么先用前插输入一个链表,然后用尾插再次输入链表的时候,不能把两次输入的链表连接在一起?

img

img

用代码块功能插入代码,请勿粘贴截图
#include<iostream>
using namespace std;

#define OK 1
#define ERROR 0

typedef int Status;
typedef struct{
    int x;
    int y;
}ElemType;
typedef struct LNode{
    int Length=0;
    ElemType data;
    struct LNode *next;
}LNode, *LinkList;
Status Init(LinkList &L)
{
    
    L = new LNode;
    if(!L) return ERROR;
    L->next = NULL;
    return OK;
}
Status Create_H(LinkList &L, int n)
{
    LinkList p;
    ElemType e;
    for(int i = 0; i < n; i ++)
    {
        p = new LNode;
        if(!p) return ERROR;
        cin >> e.x >> e.y;
        p->data = e;
        p->next = L->next;
        L->next = p;
    }
    return OK;
}



Status Create_T(LinkList &L, int n)
{
    int Length;
    LinkList r = L, p;
    for(int i = Length; i < n+Length; i ++)
    {
        p = new LNode;
        if(!p) return ERROR;
        cin >> p->data.x >> p->data.y; //产生新节点 
        r->next = p;//尾结点连接新节点 
        r = p; //新节点变成尾结点 
    }
    r->next = NULL;
    return OK;
}
Status Trv(LinkList L)
{
    
    LinkList p = L->next;
    while(p)
    {
        cout << p->data.x << ' ' << p->data.y << endl;
        p = p->next; //最后一个节点输出结束p变成NULL 
    }
    return OK;
}
Status GetE(LinkList L, int w, ElemType &e)
{
    LinkList p = L->next;
    int j = 1;
    while(p && j < w)
    {
        p = p->next;
        j ++;
    }
    if(j > w || !p) return ERROR;//j > w代表w小  !p代表w大了 
    e = p->data;
    return OK;
}
int cmp(ElemType a, ElemType b)
{
    if(a.x == b.x && a.y == b.y) return 1;
    else return 0;
}
LinkList Locate(LinkList L, ElemType e)
{
    LinkList p = L->next;
    while(p && !cmp(p->data, e))
    {
        p = p->next;
    }
    if(!p) return NULL;
    return  p;
}
Status Insert(LinkList &L, int w, ElemType e)
{
    LinkList p = L;
    int j = 0;
    while(p && j < w - 1) //p代表前一个节点存在不存在 
    {
        p = p->next;
        j ++;
    }
    if(!p || j > w - 1) return ERROR; // !p代表w大了, j > w-1说明w小了
    LinkList s = new LNode;
    if(!s) return ERROR;
    s->data = e; //先解决data,再解决线索
    s->next =  p->next;
    p->next = s;
    return OK;
}
Status Delete(LinkList &L, int w)
{
    LinkList p = L;
    int j = 0;
    while(p->next && j < w - 1) //待删的节点存在,且前一个节点未找到 
    {
        p = p->next;
        j ++;
    }
    if(!(p->next) || j > w - 1)  return ERROR;//第一个代表w大了, 第二个代表w小了
    LinkList q = p->next;
    p->next = q -> next; 
    delete q;
    return OK;
}
int main()
{
    LinkList L;
    Init(L);
    int n, w;
    ElemType e;
    cin >> n;
    while(n --)
    {
        char op;
        cin >> op;
        switch(op)
        {
case 'T':
    int n;
    cin >> n;
    Create_T(L, n);
    
    break;
case 'H':
    
    cin >> n;
    Create_H(L, n);
    
    break;
    
case 'G':
    int w;
    cin >> w;
    ElemType e;
    GetE(L, w, e);
    cout << e.x  << ' ' << e.y << endl;
    break;
    
case 'L':{
    cin >> e.x >> e.y;
    LinkList p = Locate(L, e);
    cout << p->data.x << ' ' << p->data.y << endl;
    break;}
    
case 'I': {
    cin >> w;
    cin >> e.x >> e.y;
    Insert(L, w, e);
     
    break;
}
case 'D':
    cin >> w;
    Delete(L, w);
    
    break;
}
}
    Trv(L); 
    return 0; 
}

  • 写回答

1条回答 默认 最新

  • 莪是男神 2022-09-28 16:19
    关注

    你写的尾插法创建和头插法创建不能用于插入元素,只能用于创建。
    如果强行使用,你的 Status Create_T(LinkList &L, int n) 函数的逻辑这就显得有问题了
    假设你有一个链表刚使用头插法创建完,然后你又调用了 Create_T() 函数,那么你的链表的 “ 链 ” 就断开了,因为你代码的逻辑是完全把它当成新表进行处理的,没有从原链表的尾部进行插入,是直接从链表头进行插入的

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月19日
  • 已采纳回答 10月11日
  • 创建了问题 9月25日

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况