|

楼主 |
发表于 2020-9-19 00:04:29
|
显示全部楼层
本帖最后由 Christopher. 于 2020-9-19 00:27 编辑
大佬,能在帮忙看一下嘛,我这个最后要实现插入,使最后的链表由大到小排列,但是额,,,现在排列出错,插入也出错,没查找出原因
#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;
}
|
|