LinuxSir.cn,穿越时空的Linuxsir!

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

简单的代码,怎么可能通不过??

[复制链接]
发表于 2004-10-31 22:01:25 | 显示全部楼层 |阅读模式
题目是这样的:
有带头结点的单链表,单链表顺序递增,要求删除链表中相同的元素。

#include <stdio.h>
#include <malloc.h>
#define DATATYPE2 int

typedef struct node{
        DATATYPE2         data;
        struct node*        next;
}LINKLIST;

void main(){
        int        i;
        DATATYPE2        buf[]={1,2,2,4,6};
        LINKLIST        *head,*p,*q;
        q=head=(LINKLIST*)malloc(sizeof(LINKLIST));
        head->next=NULL;
        for(i=0;i<5;i++){               
                p=(LINKLIST*)malloc(sizeof(LINKLIST));
                p->data=buf;
                q->next=p;
                q=p;
        }
        p->next=NULL;

        printf("before is :");        /*输入前的链表*/
        p=head->next;               
        while(p!=NULL){
                printf("%d\t ",p->data);
                p=p->next;
        }
        printf("\n");       

        for(p=head->next;p!=NULL;p=p->next)
                for(q=p->next;q!=NULL;q=q->next)
                        if(q->data==p->data){
                                p->next=q->next;
                                free(q);
                        }

        printf("after is :");        /*输入后的链表*/
        p=head->next;               
        while(p!=NULL)
        {
                printf("%d\t ",p->data);
                p=p->next;
        }
        printf("\n");
//        getch();
}

代码能编译通过,可不能显示正确结果。不知为何!!请高手赐教。^_^
发表于 2004-10-31 23:31:03 | 显示全部楼层
for(p=head->next;p!=NULL;p=p->next)
for(q=p->next;q!=NULL;q=q->next)
if(q->data==p->data){
p->next=q->next;
free(q);
}


当p->data=2 且q->data=2时,
free(q)将删去q指向的内存.这时p=p->next无意义.


#include <stdio.h>
#include <malloc.h>
#define DATATYPE2 int

typedef struct node{
DATATYPE2 data;
struct node* next;
}LINKLIST;

void main(){
int i;
DATATYPE2 buf[]={1,2,2,4,4,6};
LINKLIST *head,*p,*q, *t;
q=head=(LINKLIST*)malloc(sizeof(LINKLIST));
head->next=NULL;
for(i=0;i<6;i++){
p=(LINKLIST*)malloc(sizeof(LINKLIST));
p->data=buf;
q->next=p;
q=p;
}
p->next=NULL;

printf("before is :"); /*输入前的链表*/
p=head->next;
while(p!=NULL){
printf("%d\t ",p->data);
p=p->next;
}
printf("\n");

for(p=head->next;p!=NULL;p=p->next)
for(q=p->next;q!=NULL;q=q->next)
if(q->data==p->data){
t = q;
p->next=q->next;
q=p;
free(t);
}

printf("after is :"); /*输入后的链表*/
p=head->next;
while(p!=NULL)
{
printf("%d\t ",p->data);
p=p->next;
}
printf("\n");
// getch();
}
发表于 2004-10-31 23:34:11 | 显示全部楼层
是for (..;,,;q=q->next)无意义.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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