单链表是一种非常重要的数据结构,下面用C语言对单链表的操作做一个简单的总结:
typedef struct node{
int num;
struct node*next;
}Node,*LinkList;
1、单链表的创建:
创建一个单链表,链表里面存放有十个偶数(2到20),有头节点,头节点不存放元素。
LinkList CreateLinkList(){
Node*head = (Node*)malloc(sizeof(Node));
head->num = 0;
head->next = NULL;
Node*p = head;
int i = 0;
while(i++ < 10)
{
Node*newnode = (Node*)malloc(sizeof(Node));
newnode->num = i*2;
newnode->next = NULL;
p->next = newnode;
p = p->next;
}
return head;
}
2、打印这个链表除了头节点以外的全部元素。
void PrintList(LinkList head)
{
Node*p = head->next;
while(p)
{
printf("%d ",p->num);
p = p->next;
}
}
3、在这个链表中插入一个节点,分别完成下面两种情况:
(1)在第n个元素的后面插入这个节点,如果n的值大于链表节点的个数,则将要插入的节点插入到链表的最后。
(2)在元素值为n的节点后面插入新节点,若没有元素n,则将此节点插入到链表的最后。
情况(1):
void InsertNode(LinkList head, Node *p, int n)
{
Node*q = head->next;
int i = 0;
while(q)
{
++i;
q = q->next;
}
if( n >= i)
{
q = head;
while(q->next)
q = q->next;
q->next = p;
p ->next = NULL;
}
else
{
q = head;
int j = 0;
while(j < n)
{
q = q->next;
++j;
}
p->next = q->next;
q->next = p;
}
}
情况(2)
void InsertNode(LinkList head, Node*p, int n)
{
Node*q = head->next;
while(q->next != NULL && q->num != n)
q = q->next;
if(NULL == q->next)
{
q->next = p;
p->next = NULL;
}
else
{
p->next = q->next;
q->next = p;
}
}
4、链表的逆置(reverse)
分两种情况
情况(1):要求头节点不进行逆置
情况(2):头节点进行逆置,算法运行结束之后头节点在链表的结尾。
情况(1)的代码如下:
void Reverse(LinkList head)
{
Node*p = head->next;
Node*q = NULL;
while(p->next)
{
q = p->next;
p->next = q->next;
q->next = head->next;
head->next = q;
}
}
情况(2)的代码如下:
LinkList Reverse(LinkList head)
{
LinkList new_head = head;
p = head->next;
while(p)
{
head->next = p->next;
p->next = new_head;
new_head = p;
p = head->next;
}
return new_head;
}