各位大佬能帮我找找这个程序哪里有问题吗
我这个最后要实现插入,使最后的链表由小到大排列,但是额,,,现在排列出错,插入也出错,没查找出原因#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
struct Node
{
int data;
Node *next;
};
Node Head; //头结点
Node *DLList; //头指针
int length;
void init(Node *DLList);
void Sort(Node *DLList);
void Insert(Node *DLList);
void display(Node *DLList);
void swap(int &a,int &b); //&原因:不加&的话单纯是值传递,无法真正交换数值,得通过址传递来实现
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void init(Node *DLList)
{
Node *p,*q;
int i=0;
p=DLList;
printf("输入链表长度:");
scanf("%d",&length);
while (p->next!=NULL)
{
q=p->next;
p->next=q->next;
free(q);
}
printf("输入链表序列:");
for(i=1;i<=length;i++) //新建链表(尾插法)
{
p=new Node; //生成新结点
scanf("%d",&p->data);
DLList->next=p; //将尾部的结点指向新结点
DLList=p; //新结点成为尾部的结点
}
DLList->next=NULL; //当前链表结束
}
void Sort(Node *DLList)
{
Node *p;
Node *q;
Node *temp;
for(p=DLList;p->next!=NULL;p=p->next) //选择排序
{
temp=p;
for(q=DLList->next;q!=NULL;q=q->next)
{
if(p->data > q->data)
{
temp=q;
}
}
if(temp->data != p->data)
{
swap(temp->data,p->data);
}
}
}
void display(Node *DLList)
{
Node *p;
int count=0;
p=DLList;
p=p->next; //头结点未初始化,值自动为0,需要跳过头结点
while(p)
{
printf("%d ",p->data);
p=p->next;
count++;
}
printf("\n");
printf("元素个数:%d",count);
}
void Insert(Node *DLList)
{
Node *p;
Node *q;
int key;
p=DLList;
printf("输入所要插入的元素值:");
scanf("%d",&key);
while(p->next && p->data < key)
{
p=p->next;
}
if(!p)
{
q=new Node;
q=p->next;
p->data=key;
}
else{
q=new Node;
q->data=key;
q->next=p->next;
p->next=q;
}
}
int main(void)
{
DLList=&Head;
init(DLList);
Sort(DLList); //先对输入的序列进行排序
display(DLList);
printf("\n");
Insert(DLList);
display(DLList);
printf("\n");
return 0;
}
排序的那个双层for循环有两处错误,给你写了注释
for(p=DLList;p->next!=NULL;p=p->next) //选择排序
{
temp=p;
for(q=p->next;q!=NULL;q=q->next)//这里内层循环的起点不对,应该是p->next,不懂的话,自己去查冒泡法排序
{
if(temp->data > q->data)//这里应该是p和temp比较,而不是和p比较
{
temp=q;
}
}
if(temp->data != p->data)
{
swap(temp->data,p->data);
}
}
插入也有一处错误,一处多余代码,看下面注释
while(p->next && p->next->data < key)//插入节点只能插在p后面,所以这里应该是与p的下一个节点的data比较,这样才能插在p的下一个节点之前
{
p=p->next;
}
//下面直接插入即可,为什么要先判断是否为尾结点?再者,while条件是p->next,即使到了尾结点,也是p->next为NULL,p不可能为NULL
q=new Node;
q->data=key;
q->next=p->next;
p->next=q; sunrise085 发表于 2020-9-19 09:16
排序的那个双层for循环有两处错误,给你写了注释
插入也有一处错误,一处多余代码,看下面注释
好的,谢谢大佬,成功了 Christopher. 发表于 2020-9-19 09:46
好的,谢谢大佬,成功了
你这个链表已经好多天了啊。。。
要学会调试程序~否则很多错误根本找不到问题出在哪里 sunrise085 发表于 2020-9-19 09:47
你这个链表已经好多天了啊。。。
要学会调试程序~否则很多错误根本找不到问题出在哪里
好的好的{:10_250:} 还没学到链表,看不懂 sunrise085 发表于 2020-9-19 09:16
排序的那个双层for循环有两处错误,给你写了注释
插入也有一处错误,一处多余代码,看下面注释
大佬,我还想问一个,就是我这个程序,在初始化的时候,我用尾插法,最后得到的那个DLList,它是尾部结点是吗,那我后面还想做一个判别升序的操作,我想用循环遍历,p应该=什么?我用p=DLList不对
页:
[1]