为方便同学们的学习测试,这里先放上单向链表的基本模板:
#include<stdio.h>
typedef struct List
{
int data;
struct List *next;
}List;
List *creatlist();
void traverse(List* head);
int main()
{
List *head;
head=creatlist();
traverse(head);
return 0;
}
void traverse(List* head)
{
List *p=head;
if (head==NULL) return;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
}
List *creatlist()
{
List *head=NULL,*p,*q;
int x;
while(scanf("%d",&x),x!=-1)
{
p=(List *)malloc(sizeof(List));
p->data=x;
p->next=NULL;
if(head==NULL)
{ head=p;q=p; }
else
q=q->next=p;
}
return head;
}
严谨的同学可以再加一段释放链表的函数~
void traverse(Node *head)
{
Node *p=head;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void destroy(Node *head)
{
Node *p=head;
while(head)
{
head=head->next;
free(p);
p=head;
}
}
下面展示一下头插法和尾插法(带返回值),两者主要的区别就是最后形成的链表的方向不一样,且写代码时,尾插法会更为复杂一些,需要分情况讨论:
头插法(带返回值):
List *creatlist()
{
int x;
List *head=NULL,*p;
while(scanf("%d",&x),x!=-1)
{
p=(List *)malloc(sizeof(List));
p->data=x;
p->next=head;
head=p;
}
return head;
}
尾插法(带返回值):
List *creatlist()
{
List *head=NULL,*p,*q;
int x;
while(scanf("%d",&x),x!=-1)
{
p=(List *)malloc(sizeof(List));
p->data=x;
p->next=NULL;
if(head==NULL)
{ head=p;q=p; }
else
q=q->next=p;
}
return head;
}
为提高创建单向有序链表的效率,这里采用边创建边排序的方法,运用插入排序创建链表 ,插入创建链表,还分为成是否带头结点的情况,带头结点会简洁一些。
插入排序(带头结点):
node* creatlink()
{
int x;
struct Node *q,*s,*head;
head=(struct Node *)malloc(sizeof(struct Node ));
head->next=NULL;
while(scanf("%d",&x),x!=-1)
{
q=head;
s=(struct Node *)malloc(sizeof(struct Node ));
s->data=x;
s->next=NULL;
//插入排序
if(head->next==NULL)
head->next=s;
else
{
while(q->next && q->next->data < s->data)
q=q->next;
if(q->next==NULL)
q->next=s;
else
{
s->next=q->next;
q->next=s;
}
}
}
return head;
}
插入排序(不带头结点):
分类情况会稍微多一点~ ,主要就是头、尾和中间三种情况...
Node *creatlist()
{
Node *head=NULL;
int x;
while(scanf("%d",&x),x!=-1)
{
Node *s=(Node *)malloc(sizeof(Node));
Node *p,*q;
s->data=x; s->next=NULL;
if(head==NULL)
head=s;
else
{
p=head;
while(p->next && s->data>p->data)
q=p,p=p->next;
if(p==head)
{
if(s->data<p->data)
s->next=p,head=s;
else
head->next=s;
}
else if(s->data>p->data)
p->next=s;
else
{
s->next=q->next;
q->next=s;
}
}
traverse(head);
}
return head;
}