数据结构:删除数组中的元素(c++)链表形式

6378:删除数组中的元素(链表)

描述:

给定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

输入:

输入包含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<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;

void insertlist(long x,listnode l);
void deletelist(long n,listnode l);	//这个函数别写,写了之后程序会超时。
void print(listnode l);
listnode createlist();

typedef struct node
{
	long x;
	struct node*next;
}node,*listnode;

int main()
{
	listnode l,x;	//写x主要是为了插入的时候循环次数可以减少,直接用x往后插入,这样代码就不会超时
	l=createlist();
	x=l;
	long con,key,v;
	cin>>con;
	for(long i=0;i<con;i++)	//一边输入数据,一边插入节点
	{
		cin>>v;
		node*p=new node;
		p->x=v;
		p->next=NULL;
		x->next=p;
		x=x->next;
	}
	cin>>key;
	deletelist(key,l);	//删除元素相同的节点
	l=l->next;
	print(l);	//输出链表中节点元素
	return 0;
}

listnode createlist()	//创建单链表
{
	listnode l=new nodel
	l->next=NULL;
	return l;
}
void insertlist(long x,listnode l)	//好可惜啊,写这么多结果用不上,代码没有问题,就是超时
{
	node *n=new node;
	listnode q;
	q=l;
	n->x=x;
	n->next=NULL;
	while(q->next!=NULL)
	{
		q=q->next;
	}
	q->next=n;
}

void deletelist(long n,listnode l)
{
	long a=n;
	listnode t=1;
	node*q;
	q=t->next;
	while(q)
	{
		if(q->x==a)
		{
			t->next=q->next;
			free(q);
			q=t->next;
		}
		else
		{
			q=q->next;
			t=t->next;
		}
	}
}

void print(listnode l)
{
	while(l)
	{
		cout<<l->x<<" ";
		l=l->next;
	}
}

记得点个赞再走~拜托啦。

posted @ 2020-02-07 02:20  Kuller_Yan  阅读(161)  评论(0编辑  收藏  举报