又见链表

qepjatdwj 2009-03-15 12:36:52
已知单链线性表的元素递增储存。
要求删除表中相同的多余元素,并释放删除结点.

下面是我的代码,当重复元素只有一个时,可以成功删除,当多于一个时,就不对了.
分析了半天,实在看不出算法有什么错误,我已经私心各部分注释得很清楚了,高手帮我看看,谢谢!

#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;
}

...全文
70 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qepjatdwj 2009-03-15
  • 打赏
  • 举报
回复
怎么点插入C/C++代码还是这样呢,晕.

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧