C 如何对链表进行气泡排序?
我正在尝试创建一个链表并按冒泡排序。我成功地创建了链表,但当我尝试对其进行冒泡排序时,发生了一些意外,我不知道问题出在哪里。有什么问题C 如何对链表进行气泡排序?,c,C,我正在尝试创建一个链表并按冒泡排序。我成功地创建了链表,但当我尝试对其进行冒泡排序时,发生了一些意外,我不知道问题出在哪里。有什么问题 #include <stdio.h> #include <stdlib.h> //the struct of LinkedList typedef struct Node { int data; struct Node * pNext; }NODE,*PNODE; PNODE createList();//Creat
#include <stdio.h>
#include <stdlib.h>
//the struct of LinkedList
typedef struct Node
{
int data;
struct Node * pNext;
}NODE,*PNODE;
PNODE createList();//Creat one LinkedList
int lengthList(PNODE pHead);//get the length of LinkedList
void sortList(PNODE);//bubble sort
int main()
{
int length;
PNODE pHead=NULL;
pHead=createList();
sortList(pHead);
return 0;
}
//Create LinkedList
PNODE createList()
{
int i,n;
int val;
PNODE pHead=(PNODE)malloc(sizeof(NODE));
if(pHead==NULL)
{
printf("failed to create!\n");
exit(-1);
}
pHead->pNext=NULL;
PNODE pTail=pHead;
printf("please input the length of the LinkedList:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("number %d is:\n",i+1);
scanf("%d",&val);
PNODE pNew=(PNODE)malloc(sizeof(NODE));
if(pNew==NULL)
{
printf("failed to create\n");
exit(-1);
}
pNew->data=val;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
return pHead;
}
//get the length of LinkedList
int lengthList(PNODE pHead)
{
int i=0;
PNODE p=pHead->pNext;
while(p!=NULL)
{
i++;
p=p->pNext;
}
return i;
}
//bubble sort
void sortList(PNODE pHead)
{
int i,j,t,len;
PNODE p,q;
len=lengthList(pHead);
p=pHead->pNext;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i;j++)
{
q=p->pNext;
if( p->data > q->data)
{
t=p->data;
p->data=q->data;
q->data=t;
}
p=q;//here may be the error
}
}
return;
}
#包括
#包括
//LinkedList的结构
定义表结点
{
int数据;
结构节点*pNext;
}节点,*PNODE;
PNODE createList()//创建一个LinkedList
国际长项选手(PNODE pHead)//获取LinkedList的长度
无效排序列表(PNODE)//气泡排序
int main()
{
整数长度;
PNODE pHead=NULL;
pHead=createList();
分类表(pHead);
返回0;
}
//创建链接列表
PNODE createList()
{
inti,n;
int-val;
PNODE pHead=(PNODE)malloc(sizeof(NODE));
如果(pHead==NULL)
{
printf(“创建失败!\n”);
出口(-1);
}
pHead->pNext=NULL;
PNODE pTail=pHead;
printf(“请输入链接列表的长度:”);
scanf(“%d”和“&n”);
对于(i=0;idata=val;
pTail->pNext=pNew;
pNew->pNext=NULL;
pTail=pNew;
}
返回pHead;
}
//获取LinkedList的长度
国际长度列表(PNODE pHead)
{
int i=0;
PNODE p=pHead->pNext;
while(p!=NULL)
{
i++;
p=p->pNext;
}
返回i;
}
//气泡排序
无效排序列表(PNODE pHead)
{
int i,j,t,len;
p节点,q;
len=长度列表(pHead);
p=pHead->pNext;
对于(i=0;idata>q->data)
{
t=p->数据;
p->data=q->data;
q->data=t;
}
p=q;//这里可能是错误
}
}
返回;
}
您在sortList中的列表即将结束
p=pHead->pNext;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i;j++)
{
q=p->pNext;
....
p=q;//here may be the error
}
}
p=pHead->pNext;
对于(i=0;ipNext
的次数远远超过len
的次数
错误2)pHead不需要是一个完整的节点-它只是一个PNODE指针。您从不使用它的数据字段。您应该让pHead指向列表中的第一个节点,然后在pHead而不是pHead->pNext开始迭代
错误3)您永远不会清理内存分配。正如@Airsource指出的错误,请记住大多数错误都是由于程序设计选择不当造成的。试着像下面这样做&你会遇到更少的错误
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct _Node{
int data;
struct _Node* next;
}Node;
typedef struct {
Node* headPtr;
Node* tailPtr;
unsigned size;
}List;
static void create_node(List* list, int element) {
if (list->headPtr == NULL) {
// List is empty
list->headPtr = (Node* )malloc(sizeof(Node));
list->headPtr->data = element;
list->headPtr->next = 0;
list->tailPtr = list->headPtr;
list->size++;
}else{
// List was already populated
Node* temp = (Node* )malloc(sizeof(Node));
temp->data = element;
temp->next = 0;
list->tailPtr->next = temp;
list->tailPtr = temp;
list->size++;
}
}
void create_list(List* list, int length){
int ele;
int i;
list->headPtr = list->tailPtr = 0;
list->size = 0;
for (i = 0; i < length; i++) {
scanf("%d", &ele);
create_node(list, ele);
}
}
void print_list(List* list){
Node* loop = list->headPtr;
while(loop){
printf("%d ", loop->data);
loop = loop->next;
}
printf("\n");
}
int main(){
List* list;
int n;
printf("Enter the length of the list: ");
scanf("%d", &n);
create_list(list, n);
print_list(list);
bubble_sort(list);
print_list(list);
if (cleanup(list))
printf("Memory rescued!!\n");
else
printf("OOPS!! Error\n");
return 0;
}
为了清理,你要这样做
bool cleanup(List* list) {
Node* curr = list->headPtr;
Node* nxt = list->headPtr->next;
while(nxt){
free(curr);
curr = nxt;
nxt = curr->next;
}
list->headPtr = list->tailPtr = 0;
list->size = 0;
return !nxt ? true: false;
}
您的程序中有几个bug。我会逐一发言:
pnodephead=(PNODE)malloc(sizeof(NODE))代码>
在这里,您正在分配内存并在检查n是否大于0之前创建节点
printf(“请输入链接列表的长度:”)代码>
到目前为止,您已经创建了一个节点,head
节点,其中没有任何值(因此包含垃圾)
createList()
创建了一个带有n+1
节点的链表,而不是n
,并且头->值包含垃圾
解决方案:
printf("please input the length of the LinkedList:");
scanf("%d", &n);
for(i=0; i<n; i++)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(pNew == NULL)
{
printf("failed to create!\n");
exit(-1);
}
scanf("%d", &val);
pNew->data = val;
pNew->pNext = NULL;
if (!i)
pHead = pNew;
else
pTail->pNext = pNew;
pTail = pNew;
}
return pHead;
for(i = 0; i < len - 1; i++)
{
p = pHead;
for(j = 0; j < len - 1 - i; j++)
{
q = p -> pNext;
if(p->data > q->data)
{
t = p -> data;
p -> data = q -> data;
q -> data = t;
}
p = q;
}
}
一个问题:
您如何检查元素是否已排序?
printList()
例程有助于发现上述错误
“在处理输入之前,请始终通过显式打印来验证您是否正确存储了输入!”@rootkea:请不要建议您在将所有{
移动到新行的地方进行编辑。如果OP更愿意将{
在同一行,并且他们一直这样做,那么请保持代码不变。什么样的“事故”发生?请注意堆栈溢出不是调试服务。您必须提供更多关于您期望的和实际得到的详细信息。另外,请阅读:。@honk:Got!那么可能我应该将main
函数的{
移动到int main()的同一行
为了保持一致性。谢谢,@rootkea,@honk。编译器说没有错误,但当我运行它时,程序意外地停止了。@rootkea:我只是为你做的。但是,请不要建议只移动几个括号的编辑。请关注需要整体编辑的帖子,并尽可能多地进行修复。这将有助于O大多数。如果你得到了>2k的代表,你也可以做一些小的编辑,因为这样你就不再需要限制审查者的时间了。谢谢你,@Airsource有限公司,太棒了!错误1)我已经解决了这个问题。错误2)pHead只是一个指针,没有实际的数据。Bug 3)我会清理我的内存分配。谢谢,@Airsource有限公司,这是我第一次尝试在这里提问,并得到好的答案,再次感谢你,我通常会在这里走动。Bug 2),是的,我明白了。但是pHead不需要是节点…我已经修改了我的答案。顺便说一句到目前为止,发现问题的最简单方法是在调试器中运行代码。谢谢,@Mayukh Sarkar,我会尝试!这样会更简洁!如果您觉得解决方案有趣,您应该向@Airsource和我投票。
for(i = 0; i < len - 1; i++)
{
p = pHead;
for(j = 0; j < len - 1 - i; j++)
{
q = p -> pNext;
if(p->data > q->data)
{
t = p -> data;
p -> data = q -> data;
q -> data = t;
}
p = q;
}
}