该代码包含单向链表的建立,追加,遍历,删查改,判空,返回尾结点和中间节点,额外包含了单向链表的合并,排序,和将单向链表转换成循环链表.
注意:
该链表为带头节点的单向链表,头节点的数据域为-1.
将链表改为循环链表后,遍历操作不再适用于循环链表
代码如下
.
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data; //链表的数据域
struct node * next; //链表的指针域
}node;
//节点初始化
node * create_node()
{
node *p = (node*)malloc(sizeof(node));
p->data = -1;
p->next = NULL;
}
//建立链表,尾部增加
node *link_list(int d[], int size)
{
int i;
node *head = create_node();
node *tail = head; //尾节点,此时尾结点就是头结点
for(i = 0;i < size;i++)
{
node *p = (node *)malloc(sizeof(node));
p->data = d[i];
p->next = NULL;
tail->next = p;
tail = p; //p变为尾节点
}
return head;
}
//追加一个节点(尾部追加)
void append(node *head,int elem)
{
node *p = create_node();
p->data = elem;
node *s = head;
while(s->next != NULL)
{
s = s->next;
}
s->next = p;
}
//返回链表长度
int len(node *head)
{
node *s = head;
int count = 0;
for(;s != NULL;count++)
{
s = s->next;
}
return count;
}
//插入元素到链表之中
void insert(node *head,int i,int elem