题目简述:
实现顺序表(包括数组和链表)的插入。
解析:
对于数组,插入主要包括指定下标位置插入,指定元素位置后插入,或者按照顺序插入。实现方式都一样,找到位置后,首先该元素及之后的元素都后移一位,然后将该元素插入进去即可。
对于链表,插入一般指的是指定元素位置后面插入,需要注意链表不需要移位置,只需要插入一个节点即可。插入有已知前面元素和已知后面元素的插入方法。
//将newNode插入到p后面:直接插入节点
newNode-next=p->next;
newNode->value=X;
p->next=newNode;
//将newNode插入到前面:先保存值,再插入节点
newNode->value=p->value;
p->value=X;
newNode-next=p->next;
p->next=newNode;
重点:
(1)链表中已知后面元素插入的精髓在于,首先使用新节点复制该节点的值,然后将该节点的值改成要插入的值,将新节点连到该节点之后即可;
(2)插入时要注意数组插入位置是第一个元素时,另写判断;同时链表插入到最后一个元素后面时,要另写判断。
代码:
(1)数组:
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
//数组
int *a=new int[n+1];
for(int i=0;i<n;i++)
cin>>a[i];
int X;
cin>>X;
int i=0;
for(i=n-1;i>=0;i--)
{
if(a[i]<X)
{
for(int j=n;j>i;j--)
a[j]=a[j-1];
a[i+1]=X;
break;
}
}
if(i<0)
{
for(int j=n;j>0;j--)
a[j]=a[j-1];
a[0]=X;
}
for(int i=0;i<n+1;i++)
cout<<a[i]<<" ";
return 0;
}
(2)链表:
此处使用尾插法建立链表,所以插入的时候采用后知元素插入。
#include <iostream>
using namespace std;
struct ListNode{
int value;
ListNode *next;
};
//使用尾插法建立链表
void Creat_LinkList(ListNode *phead,int n){
ListNode *p=phead;
for(int i=0;i<n;i++)
{
ListNode *newNode=new ListNode;
cin>>newNode->value;
newNode->next=NULL;
p->next=newNode;
p=newNode;
}
}
int main()
{
int n;
cin>>n;
//建立头节点为空
ListNode *head=NULL;
head=new ListNode;
head->value=0;
head->next=NULL;
//使用尾插法建立链表
Creat_LinkList(head,n);
int X;
cin>>X;
int flag=0;
ListNode *p=head;
while(p->next!=NULL)
{
p=p->next;
if(p->value>X)
{
flag=1;
ListNode *Node=new ListNode;
//先将原节点值保存下来
Node->value=p->value;
p->value=X;
Node->next=p->next;
p->next=Node;
break;
}
}
//如果是插入到最后一个节点后面
if(flag==0)
{
ListNode *Node=new ListNode;
Node->value=X;
Node->next=p->next;
p->next=Node;
}
p=head;
while(p->next!=NULL)
{
p=p->next;
cout<<p->value<<" ";
}
return 0;
}
总结:
写一下动态申请数组的三种方法:
(1)使用new方法,搭配delete删除空间:使用delete删除后只剩a作为一个空指针
int n;//n为输入的数组长度
int *a=new int[n];
delete(a);
(2)使用malloc动态申请,搭配free释放空间,头文件<malloc.h>:
int *a;
a=(int *)malloc(sizeof(int)*n);
free(a);