特点:
实现单向链表的创建以及输出
#include <stdio.h>
#include <stdlib.h>
#define N 7
typedef struct node {
int data ;struct node *next;
} SN;
SN * creatlink ( int a[] )
{
SN * tail = NULL, *p;//tail是所设置的尾指针, p是程序中遍历整个链表的指针。int i;
for ( i = 0; i < N; i++ ) {
p = ( SN * ) malloc ( sizeof ( SN ) );p->data = a[i];
if ( !tail ) {
//当tail为NULL时,表示当前结点是所创建的第一个结点。
tail->next = tail = p;
}else {
//直接将p结点插入在尾结点后成为新的尾结点即可。
p->next = tail->next;tail = tail->next = p;
}
}
return tail;
}
/*在进行单向循环链表的输出时,利用do-while结构比较简单易懂,否则需要分情况使得程序出现相同代码*/
void printlink ( SN *tail )
{
SN * p = tail;
do {
printf ("%5d", p->next->data);p = p->next;
} while ( p != tail );
}
int main ( void )
{
SN * tail;int a[N] = { 10, 20, 30, 40, 50, 60, 70 };
//创建单向循环链表tail = creatlink ( a );
//输出单向循环链表printlink ( tail );
return 0;
}
单向链表的删除算法
特点:单向循环链表在删除时,和以前的链表的删除算法一样,待删结点的前驱上一定要有一个指针,需要特别注意的是:尾结点的删除,因为专门设置了一个尾指针,所以在删除尾结点时,一定要记得挪尾指针。
SN * delnode ( SN * tail, int delval )
{
//单向链表的数据域无重复值
SN * p, * delp;
p = tail;
do {
if ( p->next->data == delval )
break;
else
p = p->next;
} while ( p != tail ); //循环结束
if ( p == tail && tail->next->data != delval ) { //没有找到待删结点
printf ("Not found!\n");
}
else { //找到待删结点
if ( tail->neat == tail ) {
//表明此时链表中仅有这一个结点且当前需要删除它。
free ( tail );
tail = NULL;
}
else {
//此时链表中有两个结点及其以上
delp = p->next;
p->next = delp->next;
if ( delp == tail ) {
//判断当前所要删除结点是不是尾结点,如果是则需要先挪尾指针,否则直接释放删除结点
tail = p;
}
free ( delp );
}
}
return tail;
}
单向循环链表的插入算法
SN * insertnode ( SN * tail, SN * s )
{
//tail即尾指针, s即插入结点//设单向循环链表非空且数据域的值升序有序,使得插入后,新链表依然升序有序SN * p = tail;
do {
if ( p->next->data >= s->data ) {
break;
}
else
p = p->next;
} while ( p != tail );
if ( p == tail && tail->next->data < s->data ) {
//此时表明待插结点数据大于当前尾结点数据域值,所以插入结点将成为新的尾结点,即需挪尾指针
tail = s;
}
//接下来只需要进行插入即可
s->next = p->next;
p->next = s;
return tail;
}