第一个是链表操作文件:
声明文件Node.h:
#ifndef _NODE_H
#define _NODE_H
#define DataType int
typedef struct NODE //定义一个节点结构体
{
DataType data;
struct NODE *next;
}Node;
//链表存取数据
extern Node * Input_Node(Node *p,DataType a[],int n);
//输出链表
extern void Print_Node(Node *p);
//释放链表
extern void Delete_Node(Node *p);
#endif
实现文件Node.cpp:
#include<stdio.h>
#include<malloc.h>
#include<Node.h>
Node * Input_Node(Node *p,DataType *a,int n)
{
Node *head;
head = (Node *)malloc(sizeof(struct NODE)); //用了2种形式,为了区分,最好一致
head -> data = a[0];
p = head;
for(int i=1;i<n;i++)
{
Node *t = (struct NODE *)malloc(sizeof(Node)); //用了2种形式,为了区分,最好一致
t -> data = a[i];
head -> next = t;
head = t;
}
head -> next = NULL;
return p;
}
//输出链表
void Print_Node(Node *p)
{
if(p == NULL)
printf(“链表为空!\n”);
while(p!=NULL)
{
printf(“%d “,p -> data);
p = p -> next;
}
printf(“\n”);
}
//释放链表
void Delete_Node(Node *head)
{
Node *t;
while(head!=NULL)
{
t = head;
head = head->next;
free(t);
}
}
第二个算法文件:
声明文件middle.h:
#ifndef _MIDDLE_H
#define _MIDDLE_H
#include<Node.h>
extern Node * middle(Node *head);
#endif
实现文件middle.cpp:
#include<stdio.h>
#include”middle.h”
/*
求链表中间节点算法middle():
1、有两个指针同时从头部开始遍历。
2、一个快指针一次走两步,一个慢指针一次走一步。
3、快指针先到链表尾部,而慢指针应该则恰好到达链表中间。
*/
Node * middle(Node *head)
{
Node *fast,*slow,*pre; //定义三个节点指针,fast为快指针,slow为慢指针,pre为临时指针
int length = 1; //判断链表长度,从而知道中间值为啥
if(head == NULL) //判断能否为空链表,是空则退出
{
return NULL;
}
fast = slow = head; //快和慢指针同时指向链表首节点
while(((pre=fast->next)!=NULL)) //循环,直到快指针下个节点为空
{
++length;
if(pre->next==NULL)
break;
++length;
slow = slow ->next; //慢指针走一步
fast = pre -> next; //快指针走两步
}
if(length%2==0)
slow->data = (int)(slow->data + slow->next->data) / 2;
return slow; //返回中间节点
}
第三个主函数文件main.cpp:
#include<stdio.h>
#include<middle.h>
#include<Node.h>
int main()
{
Node *pa,*pb;
int a[5] = {1,2,3,4,5};
int b[6] = {4,5,6,7,8,9};
pa = Input_Node(pa,a,5);
pb = Input_Node(pb,b,6);
printf(“pa链表为:”);
Print_Node(pa);
printf(“pb链表为:”);
Print_Node(pb);
printf(“\n”);
Node *mid_a = middle(pa);
Node *mid_b = middle(pb);
printf(“pa链表中间节点为:%d\n”,mid_a->data);
printf(“pb链表中间节点为:%d\n”,mid_b->data);
Delete_Node(pa);
Delete_Node(pb);
return 0;
}
编译没问题的,能运行,但是显示不了pa,pb链表,能显示pa、pb中间节点后就终止了。看图:
当把他们放在一个.cpp文件运行没问题:看图
求高手解释下原因,本人只是想本人写了的链表,想以后用不要再写了,想用文件连接下,更想求指导决方案?
声明文件Node.h:
#ifndef _NODE_H
#define _NODE_H
#define DataType int
typedef struct NODE //定义一个节点结构体
{
DataType data;
struct NODE *next;
}Node;
//链表存取数据
extern Node * Input_Node(Node *p,DataType a[],int n);
//输出链表
extern void Print_Node(Node *p);
//释放链表
extern void Delete_Node(Node *p);
#endif
实现文件Node.cpp:
#include<stdio.h>
#include<malloc.h>
#include<Node.h>
Node * Input_Node(Node *p,DataType *a,int n)
{
Node *head;
head = (Node *)malloc(sizeof(struct NODE)); //用了2种形式,为了区分,最好一致
head -> data = a[0];
p = head;
for(int i=1;i<n;i++)
{
Node *t = (struct NODE *)malloc(sizeof(Node)); //用了2种形式,为了区分,最好一致
t -> data = a[i];
head -> next = t;
head = t;
}
head -> next = NULL;
return p;
}
//输出链表
void Print_Node(Node *p)
{
if(p == NULL)
printf(“链表为空!\n”);
while(p!=NULL)
{
printf(“%d “,p -> data);
p = p -> next;
}
printf(“\n”);
}
//释放链表
void Delete_Node(Node *head)
{
Node *t;
while(head!=NULL)
{
t = head;
head = head->next;
free(t);
}
}
第二个算法文件:
声明文件middle.h:
#ifndef _MIDDLE_H
#define _MIDDLE_H
#include<Node.h>
extern Node * middle(Node *head);
#endif
实现文件middle.cpp:
#include<stdio.h>
#include”middle.h”
/*
求链表中间节点算法middle():
1、有两个指针同时从头部开始遍历。
2、一个快指针一次走两步,一个慢指针一次走一步。
3、快指针先到链表尾部,而慢指针应该则恰好到达链表中间。
*/
Node * middle(Node *head)
{
Node *fast,*slow,*pre; //定义三个节点指针,fast为快指针,slow为慢指针,pre为临时指针
int length = 1; //判断链表长度,从而知道中间值为啥
if(head == NULL) //判断能否为空链表,是空则退出
{
return NULL;
}
fast = slow = head; //快和慢指针同时指向链表首节点
while(((pre=fast->next)!=NULL)) //循环,直到快指针下个节点为空
{
++length;
if(pre->next==NULL)
break;
++length;
slow = slow ->next; //慢指针走一步
fast = pre -> next; //快指针走两步
}
if(length%2==0)
slow->data = (int)(slow->data + slow->next->data) / 2;
return slow; //返回中间节点
}
第三个主函数文件main.cpp:
#include<stdio.h>
#include<middle.h>
#include<Node.h>
int main()
{
Node *pa,*pb;
int a[5] = {1,2,3,4,5};
int b[6] = {4,5,6,7,8,9};
pa = Input_Node(pa,a,5);
pb = Input_Node(pb,b,6);
printf(“pa链表为:”);
Print_Node(pa);
printf(“pb链表为:”);
Print_Node(pb);
printf(“\n”);
Node *mid_a = middle(pa);
Node *mid_b = middle(pb);
printf(“pa链表中间节点为:%d\n”,mid_a->data);
printf(“pb链表中间节点为:%d\n”,mid_b->data);
Delete_Node(pa);
Delete_Node(pb);
return 0;
}
编译没问题的,能运行,但是显示不了pa,pb链表,能显示pa、pb中间节点后就终止了。看图:
当把他们放在一个.cpp文件运行没问题:看图
求高手解释下原因,本人只是想本人写了的链表,想以后用不要再写了,想用文件连接下,更想求指导决方案?
解决方案
60
本人在XP VC6 下测试的正常, 可能是 VC6 与操作系统的兼容性问题?
按你的测试用例没有问题, 但是有即点可能要注意下
1 变量和指针尽量初始化, 这样不会导致Release 和 Debug的条件差异
2 假如 Input_Node 输入空元素的话, 可能会有访问冲突, Input_Node(0, 0, 0)
3 释放链表完了 指针应该清零, 避免 被再次使用到时误认为是有效的
按你的测试用例没有问题, 但是有即点可能要注意下
1 变量和指针尽量初始化, 这样不会导致Release 和 Debug的条件差异
2 假如 Input_Node 输入空元素的话, 可能会有访问冲突, Input_Node(0, 0, 0)
3 释放链表完了 指针应该清零, 避免 被再次使用到时误认为是有效的
//Node *pa = 0, *pb = 0; // pa = Input_Node(0, a, 5); //初始化 // pa = Input_Node(pa, b, 6); //追加 //追加元素 Node * Input_Node(Node *head, DataType *a, int n) { Node *p, *t; int i; p = head; while(p && p->next) p = p->next; //找到尾端 //追加节点 for(i=0; a && i < n; i++) { t = (Node *)malloc(sizeof(Node)); t->data = a[i]; t->next = 0; if(p) p->next = t; else head = t; //head p = t; } return head; } //Delete_Node(&pa); void Delete_Node(Node **head) { Node *t = *head, *p; if(head) { t = *head; while( t !=NULL) { p = t->next; free(t); t = p; } *head = 0; } }
20
Delete_Node 再修改下,
void Delete_Node(Node **head) { Node *t, *p; if(head) { t = *head; while( t !=NULL) { p = t->next; free(t); t = p; } *head = 0; } }