问题描述 :
使用带头结点的单链表编程:
一群学生排成一行,输入一个位置和一个学号,在该位置插入一个学生。
第一个学生的位置为1,第n个学生的位置为n。
输入说明 :
第一行输入学生信息:
第一个整数n(0<=n<=100),表示共有n个学生,其后有n个整数,表示n个学生的学号
第二行及以后各行,每行输入两个整数,表示要插入的位置及学号。
输出说明 :
每次插入一个学生后,在一行里输出完整的学号序列,以head开头,以tail结尾,学号之间以“-->”分隔(参见范例)。
如果需要插入学生的位置不合法,则输出“invalid”(不包括双引号)
注:如果已有10个学生,插入在最前面,则插入位置为1,而要插入在最后面,则插入位置为11。
输入范例 :
10 50 51 52 53 54 49 4 5 10 11
12 22
11 20
3 2
1 3
输出范例 :
invalid
head-->50-->51-->52-->53-->54-->49-->4-->5-->10-->11-->20-->tail
head-->50-->51-->2-->52-->53-->54-->49-->4-->5-->10-->11-->20-->tail
head-->3-->50-->51-->2-->52-->53-->54-->49-->4-->5-->10-->11-->20-->tail
题解:
注意n可能为0
所以要进行一下特判。
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
struct ListNode
{
int num;
ListNode* next = NULL;
};
int lenght(ListNode* head)
{
ListNode* p1;
if (head == NULL)
return 0;
p1 = head;
int l = 0;
while (1)
{
l++;
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
return l;
}
void output(ListNode* head)
{
ListNode* p1;
p1 = head;
cout << "head-->";
while (1)
{
cout << p1->num << "-->";
if ((p1->next != NULL))
p1 = p1->next;
else
break;
}
cout << "tail";
cout << endl;
return ;
}
int main()
{
int i, j;
ListNode* head, * p1, * p2;
head = NULL;
p2 = NULL;
int n, where, num;
cin >> n;
for (i = 0; i < n; i++)
{
cin >> num;
p1 = new ListNode;
p1->num = num;
if (i == 0)
head = p1;
else
p2->next = p1;
p2 = p1;
}
//p2->next = NULL;
//cout << lenght(head) << endl;
while (cin >> where >> num)
{
if (where > lenght(head)+1 || where < 1)
{
cout << "invalid" << endl;
continue;
}
if (lenght(head) + 1 == where)
{
if (head == NULL)
{
p1= new ListNode;
p1->next = NULL;
p1->num = num;
head = p1;
output(head);
continue;
}
p1 = head;
while (1)
{
if ((p1->next == NULL))
{
p2 = new ListNode;
p1->next = p2;
p2->num = num;
break;
}
else
p1 = p1->next;
}
output(head);
continue;
}
if (where != 1)
{
p1 = head;
int t = 0;
while (1)
{
t++;
if (t == (where-1))
{
p2 = new ListNode;
p2->num = num;
p2->next = p1->next;
p1->next = p2;
break;
}
if ((p1->next == NULL))
break;
else
p1 = p1->next;
}
output(head);
continue;
}
if (1 == where)
{
p2 = new ListNode;
p2->next = head;
p2->num = num;
head = p2;
output(head);
continue;
}
}
return 0;
}