回 帖 发 新 帖 刷新版面

主题:链表操作,输不出结果,回答给分

#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个回复)

沙发

头结点的概念貌似楼主不是太清楚....
头结点是一个结点 不是一个指针

板凳

NODE *head;
貌似head没有分配空间。
最好改成:NODE** head = (NODE**)malloc(sizeof(NODE*));
CreateLink(head);

3 楼

楼主是个初学者的话,一些习惯应当早点培养.
例如代码格式要规范,要有注释等.
楼主提供的函数中只有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 楼

大概能看懂  恩 偶要加油  不能输一女生 哪怕她是清华的

5 楼

我认为楼主的这个头节点错的一塌糊涂了 改认真看看书!!!

6 楼



函数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 楼

p->data = x;
  p->next=q;
  q=p;
这3句好像也不对
  p->date=x;
  p->next=q->next;
  q->next=p;
是不是??

8 楼

都对,插入的位置不同而已
一个从链表头插入,一个从链表尾插入.

9 楼

下面是我在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);
 }

我来回复

您尚未登录,请登录后再回复。点此登录或注册