单链表的删除操作的实现
1000(ms)
65535(kb)
2896 / 13622
建立长度为n的单链表,删除第i个结点之前的结点。
输入
第一行为自然数n,表示链式线性表的长度;
第二行为n个自然数表示链式线性表各元素值;
第三行为指定的删除参数i。
输出
指定删除位置合法时候,输出删除元素后的链式线性表的所有元素,元素之间用一个空格隔开。
输入不合法,输出"error!"。
样例输入
5
1 2 3 4 5
3
样例输出
1 3 4 5
#include<stdio.h>
#include<malloc.h>
struct LinkNode
{
int data;
struct LinkNode* next;
};
struct LinkNode* CreateList(int n)
{
struct LinkNode *head,*p1,*p2;//声明头指针和p1,p2操作指针
head=p1=p2=(struct LinkNode*)malloc(sizeof(struct LinkNode));//申请空间,并且将head,p1,p2指向这个空间
scanf("%d",&p1->data);//储存单链表第一个数据
for(int i=1;i<n;i++)//循环储存单链表第二个到最后的所有数据
{
p2=(struct LinkNode*)malloc(sizeof(struct LinkNode));//申请一个新的空间,并且p2指向这个空间
p1->next=p2;//p1的next指向下一个结点
p1=p2;//p1指向p2申请的新结点
scanf("%d",&p1->data);//储存数据
}
p1->next=NULL;
return head;
}
bool ListDelete(struct LinkNode*&head,int i,int n)
{
struct LinkNode *p,*q;
p=head;
if(i<=1||i>n+1)//如果输入的删除位置小于等于0或者大于单链表长度+1则输入不合法,返回false
return false;
if(i==2)//如果如果删除第一个结点,则设置头结点为头结点的next即可
{
head=p->next;
free(p);//释放空间
}
else
{
for(int j=0;j<i-3;j++)//循环查找到删除位置的前一个位置
{
p=p->next;
}
q=p->next;
p->next=q->next;//设置删除位置的前一个位置结点的next
free(q);//释放删除结点的空间
}
return true;
}
int main()
{
int n,i;
struct LinkNode *head,*p;
scanf("%d",&n);
head=CreateList(n);
scanf("%d",&i);
if(ListDelete(head,i,n))
{
p=head;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
else
{
printf("error!");
}
}
/*
#include<stdio.h>
int main()
{
int n,a[100],i;
scanf("%d",&n);
for(int j=0;j<n;j++)
{
scanf("%d",&a[j]);
}
scanf("%d",&i);
if(i<=1||i>n+1)
printf("error!");
else
{
for(int j=0;j<n;j++)
{
if(j=i-2)
for( ;j<n-1;j++)
{
a[j]=a[j+1];
}
}
for(int j=0;j<n-1;j++)
{
printf("%d ",a[j]);
}
}
}
*/