温馨提示:本题为深大OJ原题,深大的同学请勿直接抄袭,以免出现多个代码相同以致评0分的情况,代码和思路仅供参考,希望大家能逐步成长。
题目描述
已知带头结点的单链表的类界面和部分函数定义
请根据主函数的要求,完成单链表类的其他函数填空
输入
第1行先输入n表示有n个数据,接着输入n个数据
第2行输入要插入的位置和新数据
第3行输入要插入的位置和新数据
第4行输入要删除的位置
第5行输入要删除的位置
第6行输入要查找的位置
第7行输入要查找的位置
输出
数据之间用空格隔开
第1行输出创建后的单链表内容
接着每一次操作后,如果操作成功则输出整个单链表内容,如果操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出表内容
输入样例1
5 1 2 3 4 5 6 666 9 99 1 6 1 0
输出样例1
1 2 3 4 5 1 2 3 4 5 666 error 2 3 4 5 666 error 2 error
思路分析
以下思路均为本人习惯思维,仅供参考。
注意到是带头节点的单链表,头节点不存储数据,这样我们的插入和删除以及一些其他的操作都不需要区分是不是头节点。
每个操作上来先判断操作失败的情况,插入和删除还有查找都去判断位置是否合法,肯定不能小于1和大于size。
接下来就是遍历链表问题,插入和删除都需要遍历,这代码长得都一样,记住就行。
输出格式还是那样,尾部没有空格的就是先输出前n-1个,最后输出最后一个和换行。
国庆快乐。
AC代码
代码语言:javascript复制//以下完成其他类函数定义
int LinkList::LL_insert(int item,int i){
if(i<1||i>size 1)
return ERROR;
ListNode*p=head;
int j=1;
while(j <i){
p=p->next;
}
ListNode*q=new ListNode();
q->data=item;
q->next=p->next;
p->next=q;
size ;
return OK;
}
int LinkList::LL_del(int i){
if(i<1||i>size)
return ERROR;
ListNode*p=head,*q=head->next;
int j=1;
while(j <i){
p=p->next;
q=q->next;
}
p->next=q->next;
delete q;
size--;
return OK;
}
int LinkList::LL_get(int i){
if(i<1||i>size)
return ERROR;
ListNode*p=head->next;
int j=1;
while(j <i){
p=p->next;
}
return p->data;
}
void LinkList::LL_print(){
ListNode*p=head->next;
for(int i=1;i<size;i ){
cout<<p->data<<' ';
p=p->next;
}
cout<<p->data<<endl;
}
ListNode* LinkList::index(int i){return NULL;}
//主函数定义