链表对初学者来说真的很难,这题我研究了一天,在自己不断的调试和查找资料下,终于过了!
#include<iostream>
#include<stdlib.h>
using namespace std;
struct node
{
int data;
node * next;
};
void printList(node * head)
{
node * p = NULL;
p = head;
while (p!=NULL)
{
cout << p->data << " ";
p = p->next;
}
}
node * dltElemenx(node * head, int x)
{
node * p = NULL, * bp = NULL; //bp是p前面的指针,用来删除结点后连接。
p = head;
while (p) //找x并删除。
{
if (head->data==x)
{
head = head->next;
p = head;
}
else if (p->data == x)
{
if (p->next == NULL)
{
bp->next = NULL;
p = NULL;
}
else
{
bp->next = p->next;
p = p->next;
}
}
else
{
bp = p;
p = p->next;
}
}
return head;
}
void linkList(int n)
{
node * head = NULL, *p = NULL, *r = NULL; //建立一个长度为n的链表。
head = (node *)malloc(sizeof(node));
if (head == NULL)
{
cout << "Memory Failed!" << endl;
return;
}
int num;
cin >> num;
head->data = num;
head->next = NULL;
p = head;
for (int i = 1;i < n;i++)
{
r = (node *)malloc(sizeof(node));
p->next = r;
cin >> num;
r->data = num;
p = r;
p->next = NULL;
} //链表建好了。
int k;
cin >> k;
head = dltElemenx(head, k); //因为被删掉的可能是链表的第一个元素,所以头指针会改变。因此我们可以返回头指针。
printList(head);
}
int main()
{
int n;
cin >> n;
linkList(n);
return 0;
}