刪除陣列中的元素(連結串列)

m774363686發表於2014-10-19
描述

給定N個整數,將這些整數中與M相等的刪除  假定給出的整數序列為:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3  應該將其放在一個連結串列中,連結串列長度為20  要刪除的數是3,刪除以後,連結串列中只剩14個元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9

要求:必須使用連結串列,不允許使用陣列,也不允許不刪除元素直接輸出        程式中必須有連結串列的相關操作:建立連結串列,刪除元素,輸出刪除後連結串列中元素,釋放連結串列        不符合要求的程式即使通過,也會算作0分 

輸入輸入包含3行: 第一行是一個整數n(1 <= n <= 200000),代表陣列中元素的個數。 第二行包含n個整數,代表陣列中的n個元素。每個整數之間用空格分隔;每個整數的取值在32位有符號整數範圍以內。 第三行是一個整數k,代表待刪除元素的值(k的取值也在32位有符號整數範圍內)。輸出輸出只有1行: 將陣列內所有待刪除元素刪除以後,輸出陣列內的剩餘元素的值,每個整數之間用空格分隔。樣例輸入
20
1 3 3 0 -3 5 6 8 3 10 22 -1 3 5 11 20 100 3 9 3
3
樣例輸出
1 0 -3 5 6 8 10 22 -1 5 11 20 100 9

#include<stdio.h>
#include<stdlib.h>
struct node
{
	int num;
	struct node *next;
};
int a,b,c;
struct node *creat(void)
{
	struct node *head,*p,*q;
	int i;
	head = NULL;
	for(i = 0;i < a;i++)
	{
		scanf("%d",&b);
		p = (struct node*)malloc(sizeof(struct node));
		p -> num = b;
		p -> next = NULL;
		if(head == NULL)
			head = p;
		else
			q -> next = p;
		q = p;
	}
	return head;
}
struct node *del(struct node *head,int c)
{
	struct node *p,*q;
	p = head;
	while(p != NULL)
	{
		if(c == p -> num)
		{
			if(p == head)
			{
				head = p -> next;
				q = p -> next;
			}
			else
			{
				q -> next = p -> next;
			}
		}
		else
		{
			q = p;
		}
		p = p -> next;
	}
	return head;
}
void print(struct node *head)
{
	
	int i = 0;
	struct node *p;
	p = head;
	while(p != NULL)
	{
		if(i)
			printf(" ");
		printf("%d",p -> num);
		p = p -> next;
		i = 1;
	}
	printf("\n");
	
}
int main()
{
	struct node *head;
	int i = 0;
	scanf("%d",&a);
	head = creat();
	scanf("%d",&c);
	head = del(head,c);
	print(head);
	return 0;
}

相關文章