问答题
在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变为(7,10,21,30,42,51,70)。【北京工业大学1996年】
【正确答案】正确答案:算法的基本设计思想:因为是递增有序的线性表,每处理到一个结点,看其后是否有与其数值相同的元素存在,通过被删除元素结点的前驱结点删除数值相同的元素。算法的代码: LinkList DelSame(LinkList la) { //la是递增有序的单链表,本算法去掉数值相同的元素,使表中不再有重复的元素 pre=la一>next; //pce为p所指向的前驱结点的指针 p=pre一>next; //P为工作指针。设链表中至少有一个结点 while(p I=NULL) { if(p一>data==pre一>data) //处理相同元素值的结点 { u=p; p=p一>next; free(u); //释放相同元素值的结点 } else { //处理前驱和后继元素值不同的情况 pre一>next=p ; pre=p; p=p一>next ; } } pre一>next=p; //置链表尾 return la; }// DelSame 算法中假设链表至少有一个结点,即初始时pre不为空,否则p->next无意义。算法中最后pre->next=p是必需的,因为可能链表最后有数据域值相同的结点,这些结点均被删除,指针后移使p=NuLL而退出while循环,所以应有pre->next=p使链表有尾。若链表尾部没数据域相同的结点,pre和p为前驱和后继,pre->next=p也是对的。顺便提及,题目中所说的递增并非严格递增,因为“严格递增”是说各结点数据域值不同,一个值比一个值大,不会存在相同值元素。
【答案解析】