如图,代码提示我的第178行出错
完整代码如下:
#include<iostream>
using namespace std;
struct node
{
int data; // 数据域
node* next; // 指针域
};
node* create()
{
int x; // 要插入的数据
node* head = NULL;
node* current = NULL;
cin >> x;
while (x != 0) // x = 0表示结束
{
node* newNode = (node*)malloc(sizeof(node)); // 创建新节点
newNode->data = x; // 存储数据
newNode->next = NULL; // 初始化指针域为NULL
if (head == NULL) // 如果链表为空,将新节点设为头节点
{
head = newNode;
current = newNode;
}
else // 否则,将新节点添加到链表末尾
{
current->next = newNode; // 将当前节点的指针域设置为新节点
current = newNode; // 将当前节点移到新节点上,以便下次添加新节点时可以正确地连接它们
}
cin >> x; // 获取下一个数据值
}
return head; // 返回头节点指针
}
void printList(node * p)
{
cout << "链表输出:";
if (p == NULL)
{
cout << "链表为空!" << endl;
}
while (p != NULL) // p->next可能为NULL,这将导致程序崩溃。
{
cout << p->data << "\t";
p = p->next; // 将当前节点移到下一个节点上,以便继续打印下一个节点的数据。
}
cout << endl;
}
void sort(node* p) {
node* sorted = NULL;
node* it = p;
while (it != NULL) {
node* min = it;
node* ptr = it->next;
while (ptr != NULL) {
if (ptr->data < min->data) {
min = ptr;
}
ptr = ptr->next;
}
if (min != it) {
int temp = min->data;
min->data = it->data;
it->data = temp;
}
if (sorted == NULL || sorted->data > it->data) {
sorted = it;
}
it = it->next;
}
p = sorted;
}
void insert(node*& head, int data) {
node* newNode = (node*)malloc(sizeof(node)); // 创建新节点
newNode->data = data; // 存储数据
newNode->next = NULL; // 初始化指针域为NULL
if (head == NULL || head->data > newNode->data) {
newNode->next = head; // 如果新节点的值小于头节点的值,将新节点设为头节点
head = newNode; // 更新头节点指针
}
else {
node* current = head; // 初始化当前节点为头节点
while (current->next != NULL && current->next->data < newNode->data) {
current = current->next; // 遍历链表,找到正确的位置来插入新节点
}
newNode->next = current->next; // 将新节点插入到正确的位置
current->next = newNode; // 更新当前节点的指针域
}
}
void del(node*& head, int data)
{
if (head == NULL)
{
cout << "链表为空!" << endl;
}
else if (head->data == data)
{
node* temp = head;
head = head->next;
free(temp);
}
else
{
node* current = head;
while (current->next != NULL && current->next->data != data)
{
current = current->next;
}
if (current->next != NULL)
{
node* temp = current->next;
current->next = current->next->next;
free(temp);
}
}
}
void reverse(node*& head)
{
node* prev = NULL;
node* current = head;
node* next = NULL;
while (current != NULL) {
next = current->next; // 暂时存储下一个节点
current->next = prev; // 将当前节点的下一个节点指向前一个节点,实现逆序
prev = current; // 将前一个节点移动到当前节点
current = next; // 将当前节点移动到下一个节点
}
head = prev; // 头节点最后逆序后,将其设置为新的头节点
}
void splitList(node* head, node** headOdd, node** headEven) {
node* current = head;
while (current != NULL) {
if (current->data % 2 == 0) {
*headEven = current;
headEven = &((*headEven)->next);
}
else {
*headOdd = current;
headOdd = &((*headOdd)->next);
}
current = current->next;
}
(*headOdd)->next = NULL; // 最后一个奇数节点后面不需要连接其他节点,因此将其next指针设置为NULL
(*headEven)->next = NULL; // 最后一个偶数节点后面也不需要连接其他节点,因此将其next指针设置为NULL
}
void deleteList(node* head) {
node* current = head;
node* nextNode = NULL;
while (current != NULL) {
nextNode = current->next; // 记住下一个节点
delete current; // 释放当前节点的内存
current = nextNode; // 移动到下一个节点
}
if (nextNode != NULL) {
// 如果链表为空,头节点指针应该设置为NULL
delete head;
head = NULL;
}
}
int main()
{
node* list = NULL; // 这里使用的是node类型的指针变量。
while (true)
{
int choice;
cout << "请选择要进行的操作: ";
cout << "1、创建一条含正整数结点的无序链表" << endl;
cout << "2、链表结点的输出" << endl;
cout << "3、链表结点的升序排序" << endl;
cout << "4、链表结点插入" << endl;
cout << "5、链表结点删除" << endl;
cout << "6、链表逆序(升序变降序)" << endl;
cout << "7、链表拆分,将链表拆分成由奇数和偶数结点组成的两条链表" << endl;
cout << "8、释放链表" << endl;
cout << "0、退出" << endl;
cin >> choice;
switch (choice) {
case 0: // 退出程序
return 0; // 结束程序
case 1: // 创建链表功能
list = create(); // 为list赋值,以便使用它。
break;
case 2: // 输出链表功能
printList(list); // 打印链表数据。
break;
case 3: // 升序排序
sort(list);
break;
case 4: // 插入节点
int m;
cout << "需要插入的数字:";
cin >> m;
insert(list, m);
break;
case 5: // 删除节点
int n;
cout << "需要删除的数字:";
cin >> n;
del(list, n);
break;
case 6:
reverse(list);
break;
case 7:
node * listOdd, * listEven; // 用于存储拆分后的奇数链表和偶数链表的头节点指针
splitList(list, &listOdd, &listEven); // 拆分链表并存储奇数链表和偶数链表的头节点指针
break;
case 8:
deleteList(list);
break;
}
}
}