m0_74062574 2023-04-05 16:00 采纳率: 76.5%
浏览 17
已结题

链表打印出错怎么办#include <iostream>

链表打印出错怎么办?为什么插入元素的时候,插到第四个元素之后就只能打三个数据

#include<iostream>
#include<string>
using namespace std;

typedef struct student {
    int    num; // 学号
    char    name[10]; // 姓名 
    student* pre;
    student* next;
} student;
student* head = NULL;

void Insert(int x, char *n) {
    student* temp = new student();
    temp->num = x;
    for (int i = 0; n[i] != 0; i++) { temp->name[i] = n[i]; }
    temp->pre = NULL;
    temp->next = NULL;
    if (head == NULL) {head = temp; return;}
    student* current = head;
    if (current->next != NULL)current = current->next;
    temp->pre = current;
    current->next = temp;}

void Delete(int n) {//删除第N个数据元素
    student* current = head;
    if (n == 1) {
        head = head->next; 
        if (head == NULL) { cout << "Node now is empty!\n"; return; }
        head->pre = NULL;
        return;
    }
    else {
        for (int i = 0; i < n - 1; i++) { current = current->next; }
        if (current != NULL ) {
            student* p = current->pre;
            student* n = current->next;
            if (current->next == NULL) { p->next = n; return; }
            p->next = n;
            n->pre = p;
            delete current; return;
        }
        else cout << "invalid data!";        
        return;
    }
}
 
void Research(int x) {
    student* current = head;
    while(current != NULL){
        if (x == current->num) {
            cout << current->num << '\t' << current->name<<"\n"; return; }
        current = current->next;   };
    if (current == NULL) {
        cout << "invalid data!"; return;}}

void Print() {
    student* current = head;
    if (head == NULL) { cout << "Node is empty!\n"; return; }
    for(int i=1;current->next!=NULL;i++) {
        cout << current->num << '\t' << current->name<<'\n';
        current = current->next; 
    }cout << current->num << '\t' << current->name << '\n'; return;
}

void findbeforeAndAfter(int x,int i,int j) {
    student* before; student* after;
    student* current = head;
    for (int I = 0; current != NULL||current->num != x; I++) { 
        current = current->next;    }
    if (current->num == x) {
        before = current; 
        for (int I = 0; I < i; I++)before = before->pre;
        after = current;
        for (int I = 0; I < j; I++)after = after->next;
        cout <<"该学生第i个前驱学生信息为:\n" << before->num << '\t' << before->name << '\n';
        cout << "该学生第j个后继学生信息为:\n" << after->num << '\t' << after->name << '\n'; return;  }
    else {cout << "输入错误!"; return;}
}

int main() {
    int choose;
    cout << "1:插入数据元素\t2.删除数据元素\t3.查找数据元素\t4.显示线性表中的数据元素\t5.特殊查找函数\t6.退出\n";

    loop:cout<<"选择一个操作:";
    cin >> choose;

    switch (choose) {
    case(1): {
        int num; char name[10]; string s;
        cout << "num:";
        cin >> num;
        cout << "name:";
        cin >> s;
        int i = s.length();
        for (int i = 0; i < s.length(); i++) { name[i] = s[i]; }
        name[i] = '\0';
        Insert(num, name);
        goto loop; }
        case(2): {
            int x;
            cout << "删除第几个元素:";
            cin >> x;
            Delete(x);
            goto loop; }
        case(3): {
            int x;
            cout << "请输入要查找的学号:";
            cin >> x;
            Research(x); 
            goto loop; }
        case(4): { Print(); goto loop; }
        case(5): {
            int x, i, j;
            cout << "给定学号x,找到该学生第i个前驱及该学生第j个后继的学生信息,分别键入x,i,j的值:";
            cin >> x; cin >> i; cin >> j;
            findbeforeAndAfter(x, i, j);
            goto loop;  }
        case(6):return 0;
    }
    }

img

  • 写回答

3条回答 默认 最新

  • 秦_天明 2023-04-05 16:17
    关注

    在Print()函数中,for循环的条件是current->next!=NULL,但是最后一个节点的next指针应该是NULL,所以最后一个节点的数据没有被打印出来。可以将循环条件改为current!=NULL。

    在Insert()函数中,当链表中有多个节点时,如果新插入的节点是第四个节点之后的节点,那么temp->pre = NULL;会使得temp的pre指针指向NULL,也就是没有指向前面一个节点,导致后面打印链表的时候只能打印前三个节点。需要修改插入操作,将temp的pre指针指向当前节点的前一个节点,而不是直接指向NULL。修改后的代码如下:

    void Insert(int x, char *n) {
        student* temp = new student();
        temp->num = x;
        for (int i = 0; n[i] != 0; i++) { temp->name[i] = n[i]; }
        temp->pre = NULL;
        temp->next = NULL;
        if (head == NULL) {
            head = temp;
            return;
        }
        student* current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = temp;
        temp->pre = current;
    }
    这样就能正确地打印出链表中的所有节点,并且插入节点后也能正确打印链表中的所有节点了。
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月13日
  • 已采纳回答 4月5日
  • 创建了问题 4月5日

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line