代码在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链表,设计算法去

掉数值相同的元素,是表中不在有重复的元素

第1个回答  2014-04-19
这是一个简单的单链表操作题。

核心算法:

用两个指针p,pre,其中pre指向p的直接前驱结点。比较p->data和pre->data是否相等,如果相等将p继续只想下一个结点(即:p=p->next),直到不相等为止。此时就要更新pre和p的值,删除pre和p之间的结点(即:pre->next=p;),
接着让p指向pre的下一个结点(即:p=pre->next;),细节上还要注意,输入数据都是一个数的情况,指针p容易指向一个undefined loop(未定义的区域)

复杂度分析:

以lenth=5为例:

最优情况:
输入:1 2 3 4 5
最差情况:
输入:1 1 1 1 1
复杂度:O(n)

附:C++ code

#include
using namespace std;
struct List
{
int data;
struct List * next;
}; //define the Linear List
void creatlist(struct List * &head,int lenth)
{
//creat a List
struct List *p1,*p2;
p1=p2=head;
for(int i=0;i<lenth;i++)
{
p1=(struct List *)malloc(sizeof(struct List));
cin>>p1->data;
p2->next=p1;
p2=p1;
}
p1->next=NULL;
}
void deletesame(struct List *&head)
{
//delete the adjacent elements of same value
struct List *pre=head->next,*p=pre->next;
while(p!=NULL)
{
while(p!=NULL && pre->data==p->data)
p=p->next;
if(p!=NULL) //details! Key to success!
{
pre->next=p;
pre=p;
p=p->next;
}
else pre->next=NULL;
}
}
void display(struct List *&head)
{
//Ouput the List elements
struct List *p=head->next;
while(p!=NULL)
{
cout<data<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
int lenth;
cout<<"Please enter the lenth of the List:"<<endl;
cin>>lenth;
struct List *head;
head=(struct List *)malloc(sizeof(struct List));
creatlist(head,lenth);
cout<<"Before deleteing:"<<endl;
display(head);
deletesame(head);
cout<<"After deleteing:"<<endl;
display(head);
return 0;
}
第2个回答  2014-04-18
void find(node *head){
node *p,q;
p=q=head;
while(p->next!=NULL){
q=p->next;
while(q->data==p->data)
q=q->next; //跳过与p的data相同的节点
p->next=q;//将相同节点删除
p=q;
}
return;
}

代码在一个递增有序的线性表中,有数值相同的元素存在.若存储方式为单链...
用两个指针p,pre,其中pre指向p的直接前驱结点。比较p->data和pre->data是否相等,如果相等将p继续只想下一个结点(即:p=p->next),直到不相等为止。此时就要更新pre和p的值,删除pre和p之间的结点(即:pre->next=p;),接着让p指向pre的下一个结点(即:p=pre->next;),细节上还要注意,...

已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试...
{\/\/清空单链表,并释放节点所占空间 p=L->next;while(p!=NULL){ q=p->next;free(p);p=q;} L->next=NULL;return L;}

已知线性表的元素(整数)以值递增有序排列,并以单链表作存储结构。试编写...
LinkNode p = NULL; \/\/记录逆转节点的前一个节点;LinkNode r = head; \/\/记录当前节点;LinkNode q = NULL; \/\/记录逆转节点的下一个节点;while (r != NULL){ q = r->_next; \/\/保存下一个节点 r->_next = p; \/\/逆转 p = r; \/\/下一次遍历 r = q;} return p;} \/\/打印链...

...题:用单链表作存储结构,编写一个实现线性表中元素逆置的算法_百度知 ...
include<stdio.h> include <malloc.h> typedef struct node { int data;struct node *next;}sqlist;void disp1(sqlist *lq){ sqlist *t=lq;while(t!=NULL){printf("%d ",t->data); t=t->next; } } void disp2(sqlist *lq){ sqlist *t=lq;while(t->next!=NULL){printf("%d...

急急急,设计一个算法,将线性表中重复结点删除,线性表用顺序存储结构存储...
1、先对表排序,之后只一次遍历表、其间将重复(与前个表项值相同的)元素剔除;2、不排序,直接对每个元素都遍历一次全表,剔除重复元素。显然方式1较好。按方式1进一步细说:1、线性表排序(此处不讨论排序方式)要利用表本身的特点,排序只动指针、不动实际数据,这样效率高。2、已排序的表,找重...

初学者求解一道数据结构[c语言版]的题目
\/ 题目:已知线性表中的元素以值递增有序排列,并以单链表做存储结构。试写一高效的算法,删除表中所有值大于 mink 且小于 maxk 的元素(若表中存在这样的元素),同时释放 被删除节点空间,并分析你的算法的时间复杂度(注意:mink 和 maxk 是给定的两个 参变量,它们的值可以和表中的元素相同,...

假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算...
重新输入按递增排序的单链表 :\\n";cin>>p1->num;} n++;} p2->next=NULL;return head;} void Print(Node *head) \/\/ 输出链表 { Node* p=head;while (p){ cout<num<<" "; p=p->next;} cout<<endl;} Node *ReverseList(Node *head) \/\/ 单链表的逆转 { Node *p,*q,*r;p=...

已知顺序表L递增有序,编写一个算法,将X插入到线性表的适当位置上,以保...
基本方法说明:在一个有序线性表中插入一个元素,使其依然有序,那递增有序线性表来说 for example:x插入a b之间时 应满足x<=b&&x>=a;根据这个原理我们在搜索一个链表适合插入x节的位置时应该至少知道两个值,即链表的a节的值和b节的值(只有一个节点的链表另当别论。。。)那么 就有...

1。在一个有序单链表中插入值为x的新元素,使该表仍然有序。试编写该算 ...
head,5);show(head);head=insert(head,3);show(head);head=insert(head,6);show(head);head=insert(head,8);show(head);return 0;} 算法为insert函数。。第二题:冒泡排序:void bubsort(int a[],int n){ int i,j,tmp;for(i=0;i<n;i++)for(j=n-1;j>i;j--){ ...

数据结构作业
2.8 假设有两个按元素值递增有序排列的线性表A和B,均以单链表①作存储结构,试编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C,并要求利用原表(即A表和B表)的结点空间存放表C。①今后若不特别指明,链表均是指动态链表,且可以带头结点。 typedef int datatype; ...

相似回答