链表的三种构造方法

#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为所构造链表的长度。。。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值