请各位大佬看一下这个,我想从小到大排序,但是一直实现不了,帮忙看一下问题出在哪吧
#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 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("输入链表序列(以负数结束):");
do //新建节点并且赋值 (尾插法)
{
p=new Node; //生成新结点
scanf("%d",&p->data);
DLList->next=p; //将尾部的结点指向新结点
DLList=p; //新结点成为尾部的结点
i++;
}
while(p->data >= 0);
DLList->next=NULL; //当前链表结束
if(i!=length+1) //判断长度
{
printf("输入长度有误!请重新输入!");
printf("\n\n");
init(DLList);
}
}
void Sort(Node *DLList)
{
Node *p;
Node *q;
Node *temp;
for(p=DLList;p->next!=NULL;p=p->next)
{
temp=p;
for(q=p->next;q->next!=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);
}
int main(void)
{
DLList=&Head;
init(DLList);
Sort(DLList);
display(DLList);
return 0;
}
你的swap函数是值传递,无法真正交换两个变量的值,需要址传递才能真正交换两个变量的值
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
下面这张图是值传递和址传递的区别
sunrise085 发表于 2020-9-18 19:55
你的swap函数是值传递,无法真正交换两个变量的值,需要址传递才能真正交换两个变量的值
下面这张图是值 ...
好的,谢谢大佬啦,非常感谢{:5_100:} 本帖最后由 Christopher. 于 2020-9-19 00:27 编辑
sunrise085 发表于 2020-9-18 19:55
你的swap函数是值传递,无法真正交换两个变量的值,需要址传递才能真正交换两个变量的值
下面这张图是值 ...
大佬,能在帮忙看一下嘛,我这个最后要实现插入,使最后的链表由大到小排列,但是额,,,现在排列出错,插入也出错,没查找出原因
#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;
}
sunrise085 发表于 2020-9-18 19:55
你的swap函数是值传递,无法真正交换两个变量的值,需要址传递才能真正交换两个变量的值
下面这张图是值 ...
说错了,是由小到大 Christopher. 发表于 2020-9-19 00:38
说错了,是由小到大
排序的那个双层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; 还没学到
页:
[1]