这几天完成了一个链表地址查找及数据链反转的代码。(编程使我变丑……)
代码如下:
#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至六位