2018.4.2小记

 这几天完成了一个链表地址查找及数据链反转的代码。(编程使我变丑……)

     题目如下:

代码如下:

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

//typedef struct Node *PtrToNode;  
struct Linked{  
    int add;
	int data;
	int next;
    Linked *Next;  
};  
//typedef PtrToNode Linked;

Linked SCANF();
void PRINT(Linked *m);
Linked SORT(Linked *m);
void DELETE(Linked *m,int data);

int main(){
	Linked *m;
	Linked *nm;
	m=(Linked *)malloc(sizeof(Linked));	//空间大小
	nm=(Linked *)malloc(sizeof(Linked));
	*m=SCANF();
	*nm=SORT(m);
	PRINT(nm);
	return 0;
}

Linked SCANF(){
	Linked *m;
	Linked *n;
	Linked *p;
	m=(Linked *)malloc(sizeof(Linked));
	m->Next=NULL;
	n=m;
	Linked *start;
	start=(Linked *)malloc(sizeof(Linked));
	scanf("%d %d %d",&m->add,&m->data,&m->next);
	int i=m->data;
	int j=0;
	while(j<i){
		p=(Linked *)malloc(sizeof(Linked));
		scanf("%d %d %d",&p->add,&p->data,&p->next);
		p->Next=NULL;
		n->Next=p;
		n=p;
		j++;
	}
	return *m;
}

void PRINT(Linked *n){
	Linked *m;
	m=n;
	if(m->Next==NULL)
		printf("NULL!\n");
	while(m->Next!=NULL){
		m=m->Next;
		if(m->next==-1)
			printf("%05d %d %d\n",m->add,m->data,m->next);
		else
			printf("%05d %d %05d\n",m->add,m->data,m->next);
	}
}

Linked SORT(Linked *m){
	int i=0;
	int j=0;
	int add1[10000];
	int data1[10000];
	int next1[10000];
	Linked *n;
	n=m;
	Linked *p;
	Linked *q;
	Linked *s;
	p=(Linked *)malloc(sizeof(Linked));
	p->Next=NULL;
	q=p;
	while(n->Next!=NULL){
		n=n->Next;
		if(m->add==n->add){
			s=(Linked *)malloc(sizeof(Linked));
			s->add=n->add;
			s->data=n->data;
			s->next=n->next;
			s->Next=NULL;
			q->Next=s;
			q=s;
			DELETE(m,n->data);
			j++;
			break;
		}
	}
	n=m;
	while(n->Next!=NULL){
		n=n->Next;
		if(n->add==q->next){
			s=(Linked *)malloc(sizeof(Linked));
			s->add=n->add;
			s->data=n->data;
			s->next=n->next;
			s->Next=NULL;
			q->Next=s;
			q=s;
			DELETE(m,n->data);
			n=m;
			j++;
		}
	}
	if(m->next==1)
		return *p;
	s=p;
	while(s->Next!=NULL){
		s=s->Next;
		add1[i]=s->add;
		data1[i]=s->data;
		next1[i]=s->next;
		i++;
	}
	i=j/(m->next);	//次数
	int k=0;
	int g=0;
	s=p;
	q=p;
	while(k<i){
		for(g=(k+1)*(m->next)-1;g>(k*(m->next)-1);g--){
			s=s->Next;
			s->add=add1[g];
			s->data=data1[g];
			s->next=next1[g];
		}
		for(g=(k+1)*(m->next)-1;g>(k*(m->next)-1);g--){
			q=q->Next;
			if(q->Next==NULL){
				q->next=-1;
				break;
			}
			q->next=q->Next->add;
		}
		k++;
	}
	return *p;
}

void DELETE(Linked *m,int data){
	Linked *n;
	n=m;
	Linked *p;
	p=(Linked *)malloc(sizeof(Linked));
	while(n->Next!=NULL){
		if(n->Next->data==data){
			p=n->Next;
			n->Next=p->Next;
			free(p);
			break;
		}
		n=n->Next;	
	}
}

不过仍有几个疑惑:
1.定义结构体的时候我使用的是如下代码:
struct Linked{  
    int add;
	int data;
	int next;
    Linked *Next;  
};  
但是在测试页面上进行测试时发现出现了编译错误,但是在自己的C语言编译器中并没有提示有这个错误,后来我改成了下图的结构体代码:
typedef struct Node *PtrToNode;  
struct Node{  
    int add;
	int data;
	int next;
    PtrToNode *Next;  
};  
typedef PtrToNode Linked;

网页编译器显示没有编译错误了,当然进行如上图的修改之后我的链表DELETE函数就出现Damage错误了……醉了……而且所有的结构体变量都得修改成无*的指针……
    不过在修改了编译器类型为C++类型之后,就能正常运行了……所以这是C++的结构体……醉了……

2.int型的变量在输出时如果想保留之前输入进去的高位0或低位0时,可以通过输出%06d将数字高位补0至六位


P.S. 明天就要GOOGLE面试了……好紧张……我可能已经选择死亡了……准备好和面试官尬聊了……然而我啥都不会…… 再见


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值