3587 - 双向循环链表练习

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

输入n个数,在x个数后面插入k,并且删除第y个数。输出该序列。

题目输入

输入四行,第一行n表示n个数,第二行输入的n个数,第三行x,y分别表示插入和删除的位置,第四行表示需要插入的数。

题目输出

输出该序列,数字之间用一个空格分开。

输入/输出样例

输入格式

5
1 2 3 4 5
2 4
6

输出格式

1 2 6 4 5

C语言解答

/*
题目描述
	输入n个数,在x个数后面插入k,并且删除第y个数。输出该序列。
输入
	输入四行,第一行n表示n个数,第二行输入的n个数,第三行x,y分别表示插入和删除的位置,第四行表示需要插入的数。 
输出
	输出该序列,数字之间用一个空格分开。
*/

#include<stdio.h>
#include<stdlib.h>

typedef struct tagNODE
{
	int data;
	struct tagNODE *next;
	struct tagNODE *prev;
}node,*linklist;

void LinkCreat(linklist head, int n)
{
	int i,tmp_d;
	linklist newNODE,temp;
	temp = head;
	for ( i = 0; i < n; i++)
	{
		scanf("%d", &tmp_d);
		newNODE = (linklist)malloc(sizeof(node));
		newNODE->data = tmp_d;
		newNODE->next = temp->next;
		newNODE->prev = temp;
		temp->next = newNODE;
		temp = newNODE;
	}
}
void nodeADD(linklist head, int x, int k)
{
	linklist pointer,newNODE;
	pointer = head;
	while (x > 0)
	{
		pointer = pointer->next;
		x--;
	}
	newNODE = (linklist)malloc(sizeof(node));
	newNODE->data = k;
	newNODE->next = pointer->next;
	newNODE->prev = pointer;
	pointer->next = newNODE;
	if (newNODE->next != NULL)
		newNODE->next->prev = newNODE;
}
void nodeDEL(linklist head, int y)
{
	linklist pointer;
	pointer = head;
	while (y > 0)
	{
		pointer = pointer->next;
		y--;
	}
	pointer = pointer->prev;
	pointer->next = pointer->next->next;
	if(pointer->next != NULL)
		pointer->next->prev = pointer;
}
int main()
{
	int i,n,x,k,y;
	linklist head,pointer;
	head = (linklist)malloc(sizeof(node));
	head->prev = NULL;
	head->next = NULL;
	scanf("%d", &n);
	LinkCreat( head, n);

	scanf("%d%d%d", &x, &y, &k);
	nodeADD(head, x, k);
	nodeDEL(head, y);

	pointer = head;
	while (pointer->next != NULL)
	{
		pointer = pointer->next;
		printf("%d ", pointer->data);
		n--;
	}

	return 0;
}

C++解答

#include<bits/stdc++.h>
using namespace std;
struct node{
	int data;
	node *prior,*next;
};
node* Create(int n){//创建带头结点双向循环链表 
	node *h = new node;
	node *r;
	h->next = NULL;
	r = h;
	for(int i=1; i<=n; i++){
		node *p = new node;
		cin>>p->data;
	    r->next = p;
		p->prior = r; //记录前驱 
	    r = p;//更新尾指针 
	} 
	r->next = h;
	h->prior = r;
	return h;
}

void Insert(node *h, int pos, int val){
	node *p = h;
	for(int i=1; i<=pos+1; i++){
		p = p->next;
	} 
	node *s = new node;
	s->data = val;
	//增加元素 
	s->next = p;
	p->prior->next = s;
	s->prior = p->prior;
	p->prior = s;	
} 
void Delete(node *h, int pos){
	node *p = h;
	for(int i=1; i<=pos; i++){
		p = p->next;
	}
	p->prior->next = p->next;
	p->next->prior = p->prior;
	delete p;
} 
void Print(node *h){
	node *p = h->next;
	while(p!=h){
		cout<<p->data<<" ";
		p = p->next;
	}
	cout<<endl;
}
int main()
{
	node *h,*p,*pre,*q;
	int n,x,k,y,val;
	cin>>n;
	h = Create(n);//创建一个不带头结点循环单链表  
	cin>>x>>y>>val;
	Insert(h,x,val);
	Delete(h,y);
    Print(h);
	return 0;
}