天天看點

西南科技大學OJ題 單連結清單的删除操作的實作0953

單連結清單的删除操作的實作

 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]);
		}
	}
	
}
*/