ZBLOG

#include using namespace std; struct node { int data; node* next; }; enum errorcode { success, overflow, underflow, rangeerror }; class list { public: list(); int length()const; errorcode get_element(const int i, i...

这段代码实现了一个链表的基本操作,包括创建链表、插入元素、删除元素、搜索满足条件的节点等。

在主函数中,首先创建了一个list对象l1,并调用create1()方法来创建链表并初始化数据。然后通过调用search()方法来搜索并返回满足条件(偶数)的节点数量,并将结果输出到标准输出流cout。

整个程序逻辑看起来是正确的,但需要注意以下几点:

  1. 在各个成员函数中有多处内存泄漏问题。例如,在get_element()、insert()和delete_element()函数中,无需使用new关键字再分配新的node指针,直接使用已经声明的局部变量即可。
  2. 在display()方法中没有换行符或其他分隔符来区分每个节点值的输出。
  3. 在search()方法中判断p->next是否为head节点,可以改为判断p是否为空。

修正后的代码如下所示:

#include <iostream>
using namespace std;

struct node {
    int data;
    node* next;
};

enum errorcode { success, overflow, underflow, rangeerror };

class list {
public:
    list();
    int length() const;
    errorcode get_element(const int i, int& x) const;
    node* locate(const int x) const;
    errorcode insert(const int i, const int x);
    errorcode delete_element(const int i);
    node* get_head() { return head; }
    void create1();
    void insert1(int x);
    void display();
    void turnover(int count);
    int search();
private:
    int count;
    node* head;
};

list::list() {
    head = new node;
    head->next = nullptr;
    count = 0;
}

int list::length() const {
    return count;
}

errorcode list::get_element(const int i, int& x) const {
    if (i < 1 || i > count)
        return rangeerror;

    node* p = head->next;
    int j = 1;

    while (j != i && p != nullptr) {
        p = p->next; 
        j++;
    }

    if (p == nullptr)
        return rangeerror;

    x = p->data;

    return success;
}

node* list::locate(const int x) const {
    node* p = head->next;

    while (p != nullptr) {
        if (p->data == x)
            return p;
        else
            p = p->next;
    }

    return nullptr;
}

errorcode list::insert(const int i, const int x) {
    
	if (i < 1 || i > count + 1)
		return rangeerror;

	node* p = head; 
	int j = 0;

	while (j != i - 1 && p != nullptr) {
		p = p->next; 
		j++;
	}

	node* s = new node; 
	s->data = x; 
	s->next = p->next; 

	p->next = s; 
	count++; 

	return success;
}

errorcode list::delete_element(const int i) {

	if (i < 1 || i > count)
		return rangeerror;

	node* p = head; 
	int j = 0;

	while (j != i - 1 && p != nullptr) {
		p= p->next; 
		j++;
	}

	node* u = p->next;
	p->next = u->next;
	delete u;
	count--;

	return success;
}

void list::create1() {
	int x;
	cin >> x;

	while (x != -1) {
		count++;
		node* s = new node; 
		s->data = x; 
		s->next = head->next; 

		head->next = s; 

		cin >> x;
	}
}

void list::insert1(int x) {
	node* u, * P;
	P = head;

	while (P->next != nullptr && P->next->data < x)
		P = P->next;

	if (P->next == nullptr || P->next -> data > x) {
		u= new node; 
        u -> data = x; 
        u -> next= P -> next; 
        
        P -> next= u ; 
        
        count++;
    }
}

void list::display() {
	node* p = head -> next;

	while (p != nullptr) {
	    cout << p -> data << " ";
	    p=p -> next;
    }
    cout<<endl;
}

int list::search() {
	int n=0;
	
	for(node* p=head -> next;p!=nullptr;p=p -> next){
	    
	    if(p -> data % 2 == 0)
	        n++;
	        
    }
    
    return n ;
}

int main() {
	list l1;

	l1.create1();
	cout << l1.search();

	return 0;
}

这样修正后的代码应该可以正常运行,并输出满足条件的节点数量。请注意在使用链表操作时需要注意内存管理和边界情况的处理。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=3474

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?