40分tle c语言双向链表求助
查看原帖
40分tle c语言双向链表求助
313756
KobeBryant924楼主2021/3/21 21:05
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#include <ctype.h>
typedef struct node{
	int data;
	struct node* pre;
	struct node* next;
}lnode,*linklist;
int main()
{
	int n,i=1,a,op,m;
	scanf("%d",&n);
	linklist head,p,r,list;
	//构建头结点 
	list=(linklist)malloc(sizeof(lnode));
	list->next=list;//可省略 
	list->pre=list;
	//插入第一个同学 
	p=(linklist)malloc(sizeof(lnode));
	p->data=1;
	list->next=p;
	list->pre=p;
	p->next=list;
	p->pre=list; 
	while(i<n)
	{
		i++;
		scanf("%d%d",&a,&op);
		//寻找data为a的结点 
		r=list->next;//指向头结点后面的节点 
		while(r!=list&&r->data!=a)
		{
			r=r->next;
		}
		//在右边插入结点
		if(op==1)
		{
			//在双向链表中插入一个节点需要更改四个指针 
			p=(linklist)malloc(sizeof(lnode));
			p->data=i;
			p->pre=r;//新插入结点的双指针 
			p->next=r->next;
			r->next->pre=p;//下一节点的左指针 
			r->next=p; //上一节点的右指针 
		} 
		else
		{
			p=(linklist)malloc(sizeof(lnode));
			p->data=i;
			p->next=r;//新插入结点的双指针 
			p->pre=r->pre;
			r->pre->next=p;//上一节点的左指针 
			r->pre=p; //后一节点的左指针 
		}
		
	}
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d",&a);
		//双向链表删除节点 
		//寻找数据域符合的节点 
		r=list->next;//先使其指向头结点后面的节点 
		while(r!=list&&r->data!=a)
		{
			r=r->next;
		 } 
		if(r!=list)//没回来,说明找到了 
		{
			r->pre->next=r->next;
			r->next->pre=r->pre; 
			free(r);//链表删除记得free 
		}
	}
	//沿一个方向输出编号 
	p=list->next;
	while(p!=list)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	return 0;
}
2021/3/21 21:05
加载中...