單連結清單的删除操作的實作
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]);
}
}
}
*/