LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 489|回复: 6

关于链表的小问题.

[复制链接]
发表于 2004-12-4 15:55:15 | 显示全部楼层 |阅读模式
我的代码是要逆序一个链表.
先看一下我的代码:
#include <stdio.h>
#include <malloc.h>
#define DATATYPE2 int
typedef struct node{
        DATATYPE2         data;
        struct node* next;
}LINKLIST;

void display(LINKLIST *head)
{
        LINKLIST *temp;
        temp=head->next;
        while(temp){
                printf("\t%d",temp->data);
                temp=temp->next;
        }
        printf("\n");
}
void freelist(LINKLIST *head )
{
        while(head){
                LINKLIST* temp = head;
                head = head->next;
                free(temp);
        }
}

void main(){
        int                        i;
        LINKLIST        *y,*head,*p,*q,*r;
        head=(LINKLIST*)malloc(sizeof(LINKLIST));
        head->next=NULL;
        for(i=0;i<5;i++){                /*建立初始链表*/
                y=(LINKLIST*)malloc(sizeof(LINKLIST));
                y->data=i+10;
                y->next=head->next;
                head->next=y;
        }
        printf("原始链表为:");
        display(head);               
       
        //在此改变顺序
        q=NULL;p=head;               
        while(p!=NULL){
                r=q;q=p;
                p=p->next;
                q->next=r;
        }
        head->next=q;
       
        printf("倒序链表为:");
        display(head);
        freelist(head);
}
运行时总出错.我怀疑是head->next=q;这句话.
不知哪位可以解决一下阿!~~~~~~~~~~
发表于 2004-12-4 15:57:33 | 显示全部楼层
代码没有缩进!
发表于 2004-12-4 16:59:34 | 显示全部楼层
用双向循环链表来实现多简单阿
发表于 2004-12-4 18:30:41 | 显示全部楼层
按照你的程序,主程序main(),第9行(for循环)头节点head在此循环结束后,一定是指向你链表的最后一个节点,而最后一个节点的next域没有显式赋值(是一个无效指针),然后,你调用display()函数, temp=head->next;这句调用了这个无效指针,肯定会出错,唉,你编程风格一片混乱,这么点程序,把我都读胡涂了,再有,好好学好怎样调试,这样的问题一调试就明白了.
发表于 2004-12-4 18:35:26 | 显示全部楼层
主程序main()里,head->next=y;一句可改为if(head->next!=NULL)head->next=y;
发表于 2004-12-4 18:36:21 | 显示全部楼层
sorry,上面错了,if(head->next==NULL)head->next=y;
发表于 2004-12-4 19:07:41 | 显示全部楼层
还是不对,for循环里,head的next域只能由第一个结点赋值,试试改成以下
.
.
.
/*建立初始链表*/

y=(LINKLIST*)malloc(sizeof(LINKLIST));
head->next=y;//

for(i=0;i<5;i++)
{
  y->data=i+10;
  y->next=NULL;
  //创建下一个结点
  if(y->next==NULL&&i<4)
    y->next=(LINKLIST*)malloc(sizeof(LINKLIST));
  y=y->next;//最后一个结点,y=y->next=NULL

}
//以后访问链表都从head->next开始,y就没意义了
.
.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表