读书人

下面程序输出结果不如输出的链表长度

发布时间: 2013-09-17 13:35:59 作者: rapoo

下面程序输出结果不,如输出的链表长度结果不对,不知问题在哪里。请高手看下。
/*

题目:
时间:
目的:
功能:

*/

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct Node
{
int data;
struct Node* pNext;
}* PNODE, NODE;

PNODE CreateList(void)
{
int i;
int value;//输入节点的值。
int length;

PNODE pHead = (PNODE)malloc(sizeof(NODE));//pHead指向了头节点。

if(NULL == pHead)
{
printf("分配失败,程序终止");
exit(-1);
}

PNODE pTail = pHead;
pTail->pNext = NULL;//当一个链表只有一个节点的时候

printf("请输入要生成结点的个数:length = ");
scanf("%d", &length);

for(int i=0; i<length; ++i)
{
printf("请输入第%d个节点的值:", i+1);
scanf("%d", &value);

PNODE pNEW = (PNODE)malloc(sizeof(NODE));//生成新的节点。pNEW为临时节点。
if(NULL == pNEW)
{
printf("内存分配失败,程序终止。\n");
exit(-1);
}

pNEW->data = value;
pHead->pNext = pNEW;//把pNEW挂到pHead->pNext上。尾节点的后面,链表还没有造出来。
pNEW->pNext = NULL;//指针域清空,尾节点指针域为空。
pTail = pNEW;
}

return pHead;
}

//链表里不能用p++,因为链表不是连续的。
void TraverseList(PNODE pHead)//链表为空也有一个头节点。pHead指向它。空链表头节点指针域也为空。
{
PNODE p = pHead->pNext;

while(NULL != p)
{
printf("输出数据为:%d", p->data);
p = p->pNext;
}
printf("\n");

return;
}

bool IsEmpty(PNODE pHead)
{
if(NULL == pHead->pNext)
{
return true;
}
else
{
return false;
}
}

int LengthList(PNODE pHead)
{
PNODE p = pHead->pNext;
int length = 0;

while(NULL != p)
{
length++;
p = p->pNext;
}
return length;
}

bool InsertList(PNODE pHead, int position, int value)
{
int i = 0;
PNODE p = pHead;

while(NULL != p && i < position-1 )
{
p = p->pNext;
++i;
}

if(i < position-1 || NULL == p)
{
return false;
}

PNODE pNEW = (PNODE)malloc(sizeof(NODE));
if(NULL == pNEW)
{
printf("动态分配内存失败!");
exit(-1);
}
pNEW->data = value;
PNODE q = p->pNext;


p->pNext = pNEW;
pNEW->pNext = q;
}

//bool DeleteList(PNODE, int postion, int* pValue)
//{ }

void SortList(PNODE pHead)
{
int i, j, t;
PNODE p, q;
int length = LengthList(pHead);

for(i=0, p = pHead->pNext; i<length-1; ++i, p= p->pNext)
{
for(j=i+1, q=p->pNext; j<length; ++j, q = q->pNext)
{
if(p->data > q->data)//类似数组中的a[i] > a[j]
{
t = p->data; //t = a[i]
p->data = q->data;//a[i] = a[j];
q->data = t; //a[j] = t;
}
}
}

return;
}

int main(void)
{
PNODE pHead = NULL;//struct Node* pHead = NULL:

pHead = CreateList();//创建一个非循环单链表,并将该链表的头指针赋予给pHead;
TraverseList(pHead);

/*if(IsEmpty(pHead))
{
printf("链表为空!\n");
}
else
{
printf("链表非空!\n");
}*/

int length = LengthList(pHead);
printf("链表长度为:%d\n", length);

SortList(pHead);
TraverseList(pHead);

InsertList(pHead, 4, 33);
TraverseList(pHead);

return 0;
}

/*

在VC2010里的输出结果:
————————————————————————
请输入要生成结点的个数:length = 3
请输入第1个节点的值:1
请输入第2个节点的值:2
请输入第3个节点的值:3
输出数据为:3
链表长度为:1
输出数据为:3
输出数据为:3
请按任意键继续. . .


————————————————————————

*/ 链表 数据 指针 struct typedef
[解决办法]
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。

仅供参考

//假设带表头结点的单向链表头指针为head,试编写一个算法将值为5的结点插入到连接表的第k个结点前,删除第k个节点,并对该链表进行排序。
#include <stdio.h>
#include <stdlib.h>


#include <malloc.h>
#include <time.h>
struct NODE {
int data;
struct NODE *next;
} H,*head,*p,*q,*s1,*s2,*s3,*s4,*s;
int i,j,k,n,t;
int main() {
srand(time(NULL));

//填写头节点数据
H.data=-1;
H.next=NULL;
head=&H;

//创建10个节点的单链表
p=head;
for (i=0;i<10;i++) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=rand()%100;//填写0..99的随机值
q->next=NULL;
p->next=q;
p=q;
}

//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}

//将值为5的结点插入到单链表的第k个结点前
k=3;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=(struct NODE *)malloc(sizeof(struct NODE));
if (NULL==q) return 1;
q->data=5;
q->next=p->next;
p->next=q;
break;


}
p=p->next;
}

//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}

//删除第k个节点
k=5;
n=0;
p=head;
while (1) {
if (NULL==p) {
break;
}
n++;
if (k==n) {
q=p->next;
if (q) {
p->next=q->next;
free(q);
}
break;
}
p=p->next;
}

//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}

//从小到大排序
for (p=head;p!=NULL && p->next!=NULL;p=p->next) {
for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {
if (p->next->data > q->next->data) {



//交换data
// printf("swap %02d %02d\n",p->next->data,q->next->data);
// t=p->next->data;p->next->data=q->next->data;q->next->data=t;

//或者

//交换next
// printf("swap %02d %02d\n",p->next->data,q->next->data);
s1=p->next;
s2=p->next->next;
s3=q->next;
s4=q->next->next;

if (s2!=s3) {
p->next=s3;
s3->next=s2;
q->next=s1;
s1->next=s4;
} else {
p->next=s3;
s3->next=s1;
q=s3;
s1->next=s4;
}

//输出整个单链表
// s=head->next;


// while (1) {
// if (NULL==s) {
// printf("\n");
// break;
// }
// printf("%02d->",s->data);
// s=s->next;
// }
// getchar();
}
}
}

//输出整个单链表
s=head->next;
while (1) {
if (NULL==s) {
printf("\n");
break;
}
printf("%02d->",s->data);
s=s->next;
}

//释放所有节点
p=head->next;
while (1) {
if (NULL==p) {
break;
}
q=p->next;
free(p);
p=q;
}

return 0;
}
//29->82->10->22->71->05->13->60->59->39->
//29->82->05->10->22->71->05->13->60->59->39->
//29->82->05->10->71->05->13->60->59->39->
//05->05->10->13->29->39->59->60->71->82->
//


[解决办法]
pHead->pNext = pNEW;//把pNEW挂到pHead->pNext上。尾节点的后面,链表还没有造出来。


pNEW->pNext = NULL;//指针域清空,尾节点指针域为空。
pTail = pNEW;
画个图,看一下,就清楚了
你这个表
只保留pHead,pNEW,两个节点




读书人网 >C语言

热点推荐