已知单链线性表的元素递增储存。
要求删除表中相同的多余元素,并释放删除结点.
下面是我的代码,当重复元素只有一个时,可以成功删除,当多于一个时,就不对了.
分析了半天,实在看不出算法有什么错误,我已经私心各部分注释得很清楚了,高手帮我看看,谢谢!
#include<stdio.h>
#include<malloc.h>
#define OK 0
#define ERROR -1
#define FORMAT "%d"
typedef int elemtype;
typedef struct lnode
{
elemtype data;
struct lnode *next;
}lnode,*linklist;
linklist createlist()
{
linklist l,p,q;
elemtype data;
q=l=(linklist)malloc(sizeof(lnode));
scanf(FORMAT,&data);
while(data)
{
p=(linklist)malloc(sizeof(lnode)); //生成新结点
p->data=data;
p->next=NULL;
q->next=p;
q=p;
scanf(FORMAT,&data);
}
return l; //返回头结点
}//建立链表函数
elemtype getelem(linklist l,int i){
//l为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e
linklist p;
elemtype e;
int j;
p=l->next; j=1; //初始化,p指向第一个结点,j为计数器
while(p&&j<i)
{
p=p->next; ++j;
}
if(!p||j>i) return ERROR; //第i个元素不存在
e=p->data; //取第i个元素
return e;
}//取元素函数
int listdelete(linklist l,int i){
//在带头结点的单链线性表l中,删除第i个元素
linklist p,q;
p=l; int j=0;
while(p->next&&j<i-1)
{//寻找第i个结点,并令p指向其前趋
p=p->next; ++j;
}
if(!(p->next)||j>i-1) return ERROR; //删除位置不合理
q=p->next; p->next=q->next; //删除并释放结点
free(q);
return OK;
}//删除并释放结点函数
int getlength(linklist l)
{
int length=0;
while(l->next)
{
l=l->next;
length++;
}
return length;
} //求链表长度函数
void print(linklist head)
{
while(head->next)
{
printf(FORMAT,head->next->data);
printf("->");
head=head->next;
}
printf("\n");
} //打印链表函数
int main(void)
{
linklist head,p,q;
elemtype data,e;
int i,j,length;
printf("please input the elem of the linklist:\n");
p=q=head=createlist();
printf("the linklist before dealwith:\n");
print(p); //打印原链表
length=getlength(head);
while(head->next)
{ j=2;
for(i=j;i<=length;i++)
{
e=getelem(head,i); //先从第2个元素开始比较,以后从第3,4,..个元素开始比较
if(e!=head->next->data) break; //因为是递增储存,故如第一个不相等的,以后也不会有相同的元素
if(e==head->next->data)
listdelete(head,i);
}
j++;
head=head->next;
}
printf("the linklist after dealwith:\n");
print(q); //打印处理后链表
return 0;
}