简单单向链表(头插法、尾插法、插入排序创建单向链表)

为方便同学们的学习测试,这里先放上单向链表的基本模板:

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_63761366/article/details/126726470