主题:链表操作,输不出结果,回答给分
zjkzxy
[专家分:310] 发布于 2006-11-23 10:42:00
#include <stdio.h>
#include <malloc.h>
#include <process.h>
#define NULL 0
typedef struct node
{int data;
struct node *next;
}NODE;
void CreateLink(NODE **head)
{//创建一个含有头结点的单链表
NODE *p,*q; int x;
(*head)=(NODE *)malloc(sizeof(NODE));//创建头结点
if(!(*head)) exit(0);
(*head)->next=NULL; q=(*head);
printf("请输入一个结点值:x(x!=0)\n");
scanf("%d",&x);
while(x!=0)
{p=(NODE *)malloc(sizeof(NODE));
if(!p) exit(0);
p->next=p;
q=p;
printf("请输入下一个结点值:");
scanf("%d",&x);
}
q->next=NULL;
}
NODE *sort(NODE *head)
{//对链表中的结点按由小到大排序
NODE *head1,*p,*q,*t;
head1=(NODE *)malloc(sizeof(NODE));
if(!head1) exit(0);
head1->next=NULL;
p=head->next;
while(p!=NULL)
{
if(head1->next==NULL)
{
head1->next=p;
q=p->next;
p->next=NULL;
p=q;
}
else
{q=head1;
while(q->next!=NULL && p->data>q->data)
q=q->next;
t=p->next;
p->next=q->next;
q->next=p;
t=p;
}
}//while
free(head);
return head1;
}
void print(NODE *head)
{//输出单链表
NODE *p;
p=head->next;
while(p)
{printf("%3d",p->data);
p=p->next;
}
}
void main()
{NODE *head;
CreateLink(&head);
print(head);
head=sort(head);
print(head);
}
回复列表 (共9个回复)
沙发
Shadowfax [专家分:890] 发布于 2006-11-23 18:10:00
头结点的概念貌似楼主不是太清楚....
头结点是一个结点 不是一个指针
板凳
liuzyn [专家分:560] 发布于 2006-11-23 19:33:00
NODE *head;
貌似head没有分配空间。
最好改成:NODE** head = (NODE**)malloc(sizeof(NODE*));
CreateLink(head);
3 楼
goal00001111 [专家分:4030] 发布于 2006-11-26 16:30:00
楼主是个初学者的话,一些习惯应当早点培养.
例如代码格式要规范,要有注释等.
楼主提供的函数中只有void print(NODE *head)没有错误,但语句printf("%3d",p->data);在输入较大的数据(超过3位数)时,输出的数据会粘在一起,所以还不如直接写成printf("%d ",p->data);,另外如果加上一个 printf("\n");会更好.
函数void CreateLink(NODE **head)有错误,这样写是不可能得到一个链表的,我帮你改正如下:
void CreateLink(NODE **head)
{//创建一个含有头结点的单链表
NODE *p,*q; int x;
(*head)=(NODE *)malloc(sizeof(NODE));//创建头结点
if(!(*head)) exit(0);
(*head)->next=NULL; q=(*head)->next;
printf("请输入一个结点值:x(x!=0)\n");
scanf("%d",&x);
while(x!=0)
{p=(NODE *)malloc(sizeof(NODE));
if(!p) exit(0);
p->data = x;
p->next=q;
q=p;
printf("请输入下一个结点值:");
scanf("%d",&x);
}
(*head)->next=q;
}
NODE *sort(NODE *head)我认真读了一下,很惭愧,我没有读懂,所以我重新写了一个,看能否对你有所启发.
void sort(NODE *head) //使用选择排序法对链表进行排序
{
NODE *min, *pre; //分别指向当前最小节点和其前驱
NODE *q, *p = head; //用来遍历链表的临时指针
while (p->next != NULL) //遍历链表
{
min = p->next; //min开始指向当前节点
q = min->next;
while (q) //寻找最小节点的位置,并用min指向它
{
if (q->data < min->data)
min = q;
q = q->next;
}
if (p->next != min) //如果当前节点不是最小节点则交换节点位置
{
pre = p;
while (pre->next != min)
pre = pre->next;
pre->next = min->next;
min->next = p->next;
p->next = min;
}
p = p->next; //指针后移,继续处理后面的节点
}
}
由于我使用的编译器是devcpp,所以在编译时我对主函数也进行了修改:
#include <stdio.h>
#include <malloc.h>
#include <process.h>
int main()
{NODE *head;
CreateLink(&head);
print(head);
sort(head);
print(head);
system("pause");//使程序暂停,以观察输出
return 0;
}
4 楼
lg182 [专家分:40] 发布于 2006-11-26 22:25:00
大概能看懂 恩 偶要加油 不能输一女生 哪怕她是清华的
5 楼
lg182 [专家分:40] 发布于 2006-11-29 20:07:00
我认为楼主的这个头节点错的一塌糊涂了 改认真看看书!!!
6 楼
lg182 [专家分:40] 发布于 2006-11-29 20:14:00
函数void CreateLink(NODE **head)有错误,这样写是不可能得到一个链表的,我帮你改正如下:
void CreateLink(NODE **head)
{//创建一个含有头结点的单链表
NODE *p,*q; int x;
(*head)=(NODE *)malloc(sizeof(NODE));//创建头结点
if(!(*head)) exit(0);
(*head)->next=NULL; q=(*head)->next;
printf("请输入一个结点值:x(x!=0)\n");
scanf("%d",&x);
while(x!=0)
{p=(NODE *)malloc(sizeof(NODE));
if(!p) exit(0);
p->data = x;
p->next=q;
q=p;
printf("请输入下一个结点值:");
scanf("%d",&x);
}
(*head)->next=q;
}
[em18]
7 楼
lg182 [专家分:40] 发布于 2006-11-29 20:17:00
p->data = x;
p->next=q;
q=p;
这3句好像也不对
p->date=x;
p->next=q->next;
q->next=p;
是不是??
8 楼
goal00001111 [专家分:4030] 发布于 2006-11-29 21:54:00
都对,插入的位置不同而已
一个从链表头插入,一个从链表尾插入.
9 楼
lanpin [专家分:0] 发布于 2006-12-03 17:50:00
下面是我在lz的基础上做了小小改动的程序,程序我已经调试过,完全正确。
#include <stdio.h>
#include <malloc.h>
#include <process.h>
//#define NULL 0
typedef struct node
{int data;
struct node *next;
}NODE;
void CreateLink(NODE **head)
{//创建一个含有头结点的单链表
NODE *p,*q; int x;
*head=(NODE *)malloc(sizeof(NODE));//创建头结点
if(!(*head)) exit(0);
//(*head)->next=NULL;
q=*head;
printf("请输入一个结点值:x(x!=0)\n");
scanf("%d",&x);
while(x!=0)
{p=(NODE *)malloc(sizeof(NODE));
if(!p) exit(0);
p->data=x;
q->next=p;
//p->next=q;
q=p;
printf("请输入下一个结点值:");
scanf("%d",&x);
}
q->next=NULL;
}
void delet(NODE *head,int max)
{//删除相同结点max
NODE *q,*p,*t;
q=head;
p=q->next;
while(q->next!=NULL)
{
//p=q->next;
if(p->data==max)
{
t=p->next;
q->next=t;
p=t;
}else
{
q=p;
p=p->next;
}
}
}
void print(NODE *head)
{//输出单链表
NODE *p;
p=head;
while(p->next!=NULL)
{
p=p->next;
printf("%3d\n",p->data);
//p=p->next;
}
}
NODE * sort(NODE *head,int n)
{ //对链表中的结点按由大到小排序
NODE *head1,*p,*t,*s;
int max;
head1=(NODE *)malloc(sizeof(NODE));
if(!head1) exit(0);
t=head1;
while(n>0)
{ max=0;
p=head->next;
s=(NODE *)malloc(sizeof(NODE));
if(!s) exit(0);
while(p!=NULL)
{
if(max<p->data)
{
max=p->data;
s->data=max;
s->next=p;
printf("\ning....\n");
}
p=p->next;
}
t->next=s;
t=s;
s->next->data=0;
printf("\n ths sum is :%d\n",max);
n--;
}
t->next=NULL;
return(head1);
}
void main()
{NODE *head,*head1;
int n,m;
CreateLink(&head);
print(head);
scanf("\n%d",&m);//m表示想删除的结点max
delet(head,m);
print(head);
scanf("\n%d",&n);//n表示删除后表的数据个数
head1=sort(head,n);
print(head1);
}
我来回复