单链表的查找、插入与删除。设计算法,实现线性结构上的单链表的产生以及元素的查找、插入与删除。具体实现要求:
1. 从键盘输入20个整数,产生不带表头的单链表,并输入结点值。
2. 从键盘输入1个整数,在单链表中查找该结点的位置。若找到,则显示“找到了”;否则,则显示“找不到”。
3. 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出单链表所有结点值,观察输出结果。
4. 从键盘输入1个整数,表示欲删除结点的位置,输出单链表所有结点值,观察输出结果。
5. 将单链表中值重复的结点删除,使所得的结果表中个结点值均不相同,输出单链表所有结点值,观察输出结果。
6. 删除其中所有数据值为偶数的结点,输出单链表所有结点值,观察输出结果。
7. 把单链表变成带表头结点的循环链表,输出循环单链表所有结点值,观察输出结果。
8. (★)将单链表分解成两个单链表A和B,使A链表中含有原链表中序号为奇数的元素,而B链表中含有原链表中序号为偶数的元素,且保持原来的相对顺序,分别输出单链表A和单链表B的所有结点值,观察输出结果。
这个是题目。程序出了,但是运行错误。。
int List::Insert ( const int x, const int i ) {
//将新元素x插入到第i结点之前。i是结点号,从0开始。
ListNode *p = first; int k = 0;
while ( p != NULL && k< i-1 ) { p = p->link; k++; }
//循链找第i-1个结点
if ( p == NULL && first != NULL ) {
//非空表而且链短,找不到第i-1个结点
cout << "Invalid position for Insertation!\n"; return 0;
//终止插入, 函数返回0
}
ListNode *newnode= new ListNode( x, NULL );
//建立一个newnode指示的新结点, 数据为x
if ( first == NULL || i == 0 ) {
//插入空表或非空表第一个结点之前
newnode->link = first;
//新结点成为第一个结点
if ( first == NULL ) last = newnode;
//原为空表时,表尾指针指向这个新结点
first = newnode;
}
else { //插入在链表的中间或尾部
newnode->link = p->link;
if ( p->link == NULL ) last = newnode;
p->link = newnode;
}
return 1; //正常插入,函数返回1
}
删除:
int List::Remove ( int i ) {
//将链表中的第i个元素删去, 通过函数返回该元素。若i不合理, 则返回NULL。
if ( i < 0 ) { cout << "Invalid position for Deletion!\n"; return 0;} //不能删除, 函数返回0
ListNode *p = first, *q; int k = 0;
while ( p != NULL && k< i-1 ) { p = p->link; k++; }
//循链找第i-1个结点
if ( p == NULL || p->link == NULL ) {
//空表或者链短,找不到第i-1个结点
cout << "Invalid position for Deletion!\n";
return 0; //不能删除, 函数返回0
}
if ( i == 0 ) {q = first; p = first = first->link; }
//删第一个结点时,重新拉链
else { q = p->link; p->link = q->link; }
//删中间一个结点或尾结点时
if ( q == last ) last = p;
//删表尾结点时, 表尾指针修改
k = q->data; delete q; return k;
//取出被删结点中的数据值
}
[此贴子已经被作者于2006-10-31 22:07:56编辑过]