单向链表有如下优点:
1.插入,删除元素无需移动其他元素
2,.无多余元素存储空间
同样也有缺点:
1.节点指针域占用额外存储空间;
2.访问第i 号节点必须从头结点出发效率低
代码如下:
/*
1.程序是用纯C语言编写
2.为方便数据的类型仅仅用了int类型,排序等需要比较的算法若用其它数据类型则应该修改对应得程序,当然也可以
将算法改造为适应多种类型的算法,如upsort函数传入一个比较函数LT()的函数指针,则可在算法中直接应用,比较不同
的数据类型,只需修改相应的比较算法。
*/
//线性表的链式存储结构
#include "stdafx.h"
#include "stdio.h"
#include <stdlib.h>
typedef struct node
{
int data;//这里只测试int类型的数据
struct node *next;
}LNode, *LinkList;
LinkList create()//创建链表方法一,元素先入先出法
{
LinkList h = (LinkList)malloc(sizeof(LNode)); //附加头结点
LinkList last = h;
int e;
while(1)
{
scanf("%d", &e);
if(e==0) //若输入为0,输入终止
break;
last->next = (LinkList)malloc(sizeof(LNode));
last->next->data = e;
last = last->next;
}
last->next = NULL;
return h;
}
void print(LinkList h)//打印链表的内容
{
LinkList p = h->next; //h指向第一个存储数据的node
while(p)
{
printf("%d ", p->data);
p = p->next;
}
}
void insert(LinkList h, int d, int e)//插入到第一个数据为e之前
{
LinkList pr, p;
pr = p = h;
while(p)
{
p = p->next;
if(p->data == e)
{
pr->next = (LinkList)malloc(sizeof(LNode));
pr = pr->next;
pr->data = d;
pr->next = p;
break;
}
pr = p;
}
if(pr == NULL)
printf("找不到插入位置!");
}
void clear(LinkList h)
{
LinkList p = h->next;
h->next = NULL;
LinkList q;
while(p)
{
q = p;
p = p->next;
free((void *)q); //释放节点内存
}
}
void del(LinkList h, int e) //删除值为e的所有节点,O(n)
{
LinkList q , p;
q = h; //总是指向当前节点的前一个节点
p = h->next;
while(p)
if(p->data == e)
{
q->next = p->next;
free((void *)p);
p = q->next;
}
else
{
q = p;
p = p->next;
}
}
void reverse(LinkList h)//链表内容反转,时间复杂度O(n)
{
LinkList q, p;
q = h->next;
h->next = NULL;
while(q)
{
p = q;
q = q->next; //去下节点,用p指向
p->next = h->next;
h->next = p; //插入到 p节点之前
}
}
void upsort(LinkList h)//给链表升序排序
{
LinkList q = h->next; //断开头结点
h->next = NULL;
while(q) //依次取下节点并插入升序链表
{
LinkList s = q; //摘下节点s
q = q->next;
LinkList pr = h;//初始化主从动指针
LinkList p = h->next;
while(p&&(p->data < s->data)) //寻找插入位置
{
pr = p;
p = p->next;
}
pr->next = s; //将节点s插入升序链表中
s->next = p;
}
}
void merge(LinkList ha, LinkList hb, LinkList hc)
{
LinkList pa, pb, pc, p;
pa = ha->next;
pb = hb->next;
pc = hc;
while(pa&&pb)
if(pa->data < pb->data)
{
p = pa;
pa = pa->next;
pc->next = p;
pc = p;
}
else
{
p = pb;
pb = pb->next;
pc->next = p;
pc = p;
}
if(pa) pc->next = pa;
if(pb) pc->next = pb;
}
void destroy(LinkList h) //摧毁链表
{
LinkList p = h;
while(p)
{
p = p->next;
free((void *)h);
h = p;
}
}
int main()
{
LinkList h = create(); //创建
print(h); //打印
printf("\n");
//测试插入算法
/*
int d, e;
scanf("%d%d", &d, &e);
insert(h, d, e);
print(h);
*/
//测试删除算法
/*
int d1;
scanf("%d", &d1);
del(h, d1);
print(h);
*/
//测试颠倒算法
/*
reverse(h);
print(h);
*/
//测试升序算法
/*
upsort(h);
print(h);
*/
LinkList a = create();
print(a);
upsort(h);upsort(a);
LinkList c = create();
merge(a, h, c);
print(c);
return 0;
}