#include<stdio.h>
#include<malloc.h>
#define MAX 100000
typedef struct SLink
{
int data;
struct SLink *next;
}SNode;
/*前向插入法构造简单链表*/
SNode * CreateLinkA()
{
int x;
SNode *head,*p;
//SNode *p;
head=NULL;
scanf("%d",&x);
while(x!=0)
{
p=(SNode *)malloc(sizeof(SNode));
p->data=x;
p->next=head;
head=p;
scanf("%d",&x);
}
return head;
}
/*向后插入法构造单向加头链表*/
SNode * CreateLinkB()
{
int x;
SNode *head,*last,*p;
head=last=(SNode *)malloc(sizeof(SNode));
scanf("%d",&x);
while(x!=0)
{
p=(SNode *)malloc(sizeof(SNode));
p->data=x;
last->next=p;
last=p;
scanf("%d",&x);
}
last->next=NULL;
return head;
}
/*有序插入法构造单向加头有序循环链表*/
SNode * CreateLinkC()
{
int x;
SNode *head,*f,*s,*p;
head=(SNode *)malloc(sizeof(SNode)); //申请表头结点
head->data=MAX; //设置监督元
head->next =head; //构造空链表
scanf("%d",&x);
while(x!=0)
{
p=(SNode *)malloc(sizeof(SNode));
p->data=x;
f=head;s=f->next ;//设置搜索指针初值
while(s->data<x) //循环,查找x的有序位置
{
f=s;
s=s->next ;
}
/*将新结点x插入在f->和s->之间*/
f->next =p;
p->next =s;
scanf("%d",&x);
}
return head;
}
void OutPut(SNode * head)
{
SNode * p=head;
while(p->next!=NULL)
{
printf("%d->",p->data);
p=p->next;
}
printf("%d",p->data);
}
void main()
{
printf("开始创建链表......\n");
SNode *head=CreateLinkC();
printf("开始输出链表......\n");
OutPut(head->next);
}
不带头结点的链表反转:
void Invert(SNode *&head)
{
SNode *p,*q,*r;
p=head;
q=p->next ;
while(q!=NULL)
{
r=q->next ;
q->next =p;
p=q;
q=r;
}
head->next =NULL; //将第一个结点的next赋值为NULL
head=p; //将P改为头结点
}
CreateLinkC()的最坏情况和平均情况的时间复杂度都是O(n^2),其他两个构造函数的时间
复杂度为O(n),n为所构造链表的长度。。。。。