一、尾插法建表1
算法思路:每次在链表的尾部增加新的结点. 设数据元素的类型为int,利用InsertLinkList(LinkList head, int x, int i)来实现,依次增大插入位置,使新的结点链入到链表中。
算法实现:
LinkList CreatLinkList1( )
{ LinkList head;
int x,i;
head=InitiateLinkList( ) //建空表
i=1; //插入位置初值
scanf("%d",&x); //读入第一个元素
while (x!=flag) // flag表示结束标志
{ InsertLinkList(head,x,i)
i++
scanf("%d",&x); }
return head; }
时间复杂度为O(n2)
二、尾插法建表2
算法思路:每次在链表的尾部增加新的结点.用一个指针指向表尾,为新的结点链入指明了位置。
算法实现:
LinkList CreatLinkList2( )
{ LinkList head;
Node *q,*t;
int x;
head=malloc(sizeof(Node)); //生成头结点
q=head; //尾指针置初值
scanf("%d",&x);
while (x!=flag) //flag表示结束标志
{ t=malloc(sizeof(Node)); //生成新结点
t->data=x;
q->next=t; //新结点链入
q=t; //修改尾指针
scanf("%d",&x);
}
q->next=NULL; return head; //q指向尾指针,置尾结点标志
}
该算法的时间复杂度为O(n)。
三、头插法建表
算法思路:每次在链表的头部增加新的结点.
算法实现:
LinkList CreatLinkList3( )
{ LinkList head;
Node *p;
int x;
head=malloc(sizeof(Node)); //生成头结点
head->next=NULL;
scanf("%d",&x);
while (x!=flag) // flag为根据实际情况设定的结束数据输入的标志数据
{ p=malloc(sizeof(Node));
p->data=x; //申请结点,添装数据
p->next=head->next; //头插:插入新结点在第一个结点处
head->next=p;
scanf ("%d",&x);
}
return head;
}
该算法的时间复杂度为O(n),但其形成的链表数据顺序与数据输入顺序相反。
四、删除重复结点
算法思路:用指针q指向第一个数据元素结点,从它的后继结点开始到表的结束,查找与其值相同的结点并删除之;q指向下一个结点;依此类推,q指向最后结点时算法结束。
void PurgeLinkList(LinkList head)
{ Node *p,*q,*r;
q=head->next; //q指向第一个结点
while (q!=NULL)
{ p=q;
while (p->next!=NULL) //从*q的后继开始找重复结点
if (p->next->data==q->data)
{ r=p->next; //找到重复结点,用r指向,删除*r
p->next=r->next;
free(r);
}
else p=p->next;
q=q->next; } //q指向下一个,继续
}