【问题描述】
输入n个数据,建立带有头结点的单链表,并将建立好的单链表中的数据从头至尾遍历输出,再输入一个数据,如果在该单链表中有该数据则删除该数据(假设数据不重复),再输出链表中的内容。
【输入形式】
输入有三行
第一行为整数n;
第二行为n个整数,整数与整数之间用一个空格隔开。
第三行为一个整数。
【输出形式】
分两行输出,第一行为与输入顺序相同的原数据,数据与数据之间用空格隔开。
第二行为删除上述第三行输入的数据之后链表中剩下的内容。
【样例输入】
5
1 2 3 4 5
3
【样例输出】
1 2 3 4 5
1 2 4 5
#include<iostream>
using namespace std;
struct node
{
int data;
node* next;
};
node* create(int n)//创建链表
{
node* head;
head = new node;
head->next = NULL;
for (int i = 0; i < n; i++)
{
node* p;
p = new node;
cin >> p->data;
p->next = head->next;
head->next = p;
}
return head;
}
void print(node* head)
{
node* pre = NULL;//反转
node* cur = head->next;
node* tmp;
while (cur)
{
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
node* p = pre;
node* a = pre;
node* q = pre->next;
while (pre)
{
cout << pre->data << " ";
pre = pre->next;
}
cout << endl;
int n;
cin >> n;
while (q != NULL && q->data != n && p->data != n)
{
q = q->next;
p = p->next;
}
if (p->next != NULL && p->data != n)
{
p->next = q->next;
delete q;
}//下面是第一个需要删掉的情况
if (p->data == n)//先指向第一个的后一个再删,因为a是从第一个开始。
{
a = a->next;//a从第二个开始
delete p;
}
while (a)
{
cout << a->data << " ";
a = a->next;
}
}
int main()
{
node* p;
int n;
cin >> n;
p = create(n);
print(p);
}