#2
书生牛犊2016-10-05 18:52
#define ERROR
#define OK 这两个define没有任何实质性内容。如果你是初学编程,我不建议你这么用。这个东西通常是用在include头文件的时候为了避免重复递归互相include而设计的。当然,这两句和你的目前程序之间也没有任何联系。 程序代码: void PriList(LinkList L)/*输出线性表内容的函数*/ { LinkList p; printf("\n链表内容为\n"); p=L->next; while(p->next!=NULL)//我还没有调试运行你的程序,没有完整看完代码,但是这个while循环我认为是有问题的,我见过带头结点的链表也见过没带头结点的,但是没见过带两个头结点的。你这里的p==L->next;然后进循环的时候你又让他先指向它的next,然后才输出。换句话说,进入这个函数的时候,程序输出的第一个数据就是L->next->next->data我相信这绝对不是你真的想要的数据。 { p=p->next; printf("%d\n",p->data); } } 程序代码: LinkList CreatFromTail(LinkList L) { free(L);//free函数都把L所指向的空间释放了 Node* r,* s; r=L->next;//这里这么用就属于是传说的野指针了,因为原来L所指向的空间此前已经变成无主之物,虽然你可以访问,可以当做LinkLinst类型用,但已经是一件不受规则保护的事了。L所指的空间随时可能被其他变量覆盖使用。 int flag=1; int c; printf("结束时请输入1000请输入\n"); while(flag) { scanf("%d",&c); if(c!=1000) { s=(Node*)malloc(sizeof(Node)); s->data=c; r->next=s; r=s; } else { flag=0; r->next=NULL; } } return(L); } 程序代码: int main() ...问题还有很多。。不一一举出,我也没有完全看完读懂。{ LinkList L,L1; InitList(&L); //这两个InitList貌似没起任何作用 InitList(&L1); //比如L1,在下一行就被覆盖掉了。你申请的空间根本就没来得及使用。。 L1=MergeLinkList(); return 0; } 你连free()函数干了什么都不了解。我相信你应该是初学指针。初学才会专门写一个InitList()函数而只是为了malloc一下而已。。其实这种写法看似省略了重复的代码,其实不利于后面读代码的人理清程序思路。每一个函数就好像一个新机器上的一个按钮似的。按钮多了看似精确高明,其实并不会让使用的人觉得好用。你在每一个声明指针的地方写一个malloc多好,别人看到那里就直接知道你定义并初始化过了。写个专门的函数,别人还得动一下脑子,想一下这个函数干嘛的。。 --------------------------- 写指针的程序的时候,务必小心谨慎,你必须时时刻刻知道你写的每一个指针每一个时刻指向了哪一个元素。我很确信你并不清楚你写的代码你自己都不知道在干吗。比如: LinkList CreatFromTail(LinkList L)中r=L->next;L->next在那个时刻其实等于NULL,也就是说r=L->next =NULL;那么后续代码你用的又都是r->next...这些都导致程序奔溃。。 --------------------------- |
#define ElemType int/*线性表内数据类型定义为整形 */
#define ERROR
#define OK
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{ElemType data;
struct Node* next;
}Node,* LinkList; /*链表的结构体建立&命名*/
InitList(LinkList* L)
{
*L=(LinkList)malloc(sizeof(Node));
(*L)->next==NULL;
}
void PriList(LinkList L)/*输出线性表内容的函数*/
{
LinkList p;
printf("\n链表内容为\n");
p=L->next;
while(p->next!=NULL)
{
p=p->next;
printf("%d\n",p->data);
}
}
void PriList1(LinkList L)/*输出线性表内容的函数*/
{
LinkList p;
printf("\n链表内容为\n");
p=L;
while(p->next!=NULL)
{
printf("%d\n",p->data);
p=p->next;
}
}
LinkList CreatFromTail(LinkList L)
{
free(L);
Node* r,* s;
r=L->next;
int flag=1;
int c;
printf("结束时请输入1000请输入\n");
while(flag)
{
scanf("%d",&c);
if(c!=1000)
{
s=(Node*)malloc(sizeof(Node));
s->data=c;
r->next=s;
r=s;
}
else
{
flag=0;
r->next=NULL;
}
}
return(L);
}
void RelectSortRiseList(LinkList L)
{
Node *first,*tail,*p,*pr,*min;
first=NULL;
while(L!=NULL)//当所有节点排序后都会脱离原来的链表,都脱离后原链表为空 结束循环
{
for(p=L,min=L;p->next!=NULL;p=p->next)
{
if(p->next->data<min->data)
{
pr=p;
min=p->next;//p->next是最小值所在的节点。
}
} //for循环是为找到最小值所在的节点
if(first==NULL)
{
first=min;
tail=min;
} //有序链表中无节点时。
else
{
tail->next=min;
tail=min;
}//if结构是为让最小值节点插入有序链表中
if(min==L)
{
L=L->next;
} //找到的最小节点是首节点时
else
{
pr->next=min->next;
} //if结构是为了让最小值节点脱离原来的链表
}
if(first!=NULL)
{
tail->next=NULL;
}
L=first;
}
LinkList MergeLinkList()
{
LinkList pa,pb,r;
LinkList LC,LA,LB;
InitList(&LC);
InitList(&LA);
printf("请建立链表LA\n");
LA=CreatFromTail(LA);
printf("\n请建立链表LB\n");
LB=CreatFromTail(LB);
RelectSortRiseList(LA);
RelectSortRiseList(LB);
pa=LA->next;
pb=LB->next;
LC=LA;
LC->next=NULL;
r=LC;
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<=pb->data)
{
r->next=pa;r=pa;pa=pa->next;
}
else
{
r->next=pb;r=pb;pb=pb->next;
}
}
if(pa==NULL)
{
r->next=pa;
}
else
r->next=pb;
PriList(LC);
free(LB);
return (LC);
}
int main()
{
LinkList L,L1;
InitList(&L);
InitList(&L1);
L1=MergeLinkList();
return 0;
}