单链表的实现函数
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node_t
{
datatype data;//数据域
struct node_t *next;//指针域,指向自身结构体的指针
}link_node_t,*link_list_t;
创建一个有头单向链表
link_node_t *CreateEpLinkList()
{
link_node_t *h = (link_list_t)malloc(sizeof(link_node_t));
if(NULL == h)
{
printf("h malloc failed\n");
return NULL;
}
h->next = NULL;
return h;
}
遍历无头
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
遍历有头
while(p->next!=NULL)
{
p=p->next;
printf("%d",p->data);
}
链表插入
解题思想:
1、先遍历找到要插入节点的前一个节点,假设这个节点为A;A的下一个节点为B;
将C插入A与B之间;
2、先让C的指针域指向B;
3、再让A的指针域指向C;
(注意:顺序不可以调换)
int insert_linklist(link_node_t *p,int post,int data)
{
link_node_t *pnew= (link_list_t)malloc(sizeof(link_list_t));
if(NULL==pnew)
{
printf("失败");
return -1;
}
pnew->data=data;
pnew->next=NULL;
int i;
for(i=0;i<post;i++)
{
p=p->next;
}
pnew->next=p->next;
p->next=pnew;
return 0;
}
链表指定位置删除
解题思想:
1、先遍历找到要删除节点的前一个节点,假设为A;
2、找一个临时指针指向要删除的节点;
3、将A的指针域指向删除节点的下一个节点;
int del_linklist(link_node_t * p,int post)
{
int i;
for(i=0;i<post;i++)
{
p=p->next;
}
link_node_t *pdel=NULL;
pdel=p->next;
p->next=pdel->next;
free(pdel);
pdel=NULL;
return 0;
链表逆序
解题思想:
1、将头节点与当前链表断开,断开前保存头节点的下一个节点,保证后面链表能找得到,定义一个q保存头节点的下一个节点,断开后前面相当于一个空的链表,后面是一个无头的单向链表
2、遍历无头链表的所有节点,将每一个节点当做新节点插入空链表头节点的下一个节点(每次插入的头节点的下一个节点位置)
void ReverseLinkList(link_node_t *p)
void turn_linklist(link_node_t *p)
{
link_node_t *q=NULL;
link_node_t *temp=NULL;
p->next=NULL
while(p!=NULL)
{
temp=q->next
q->next=p->next;
p->next=q;
q=temp;
}
总结:顺序表和单向链表比较(****)
1、顺序表在内存当中连续存储的(数组),但是链表在内存当中是不连续存储的,通过指针将数据链接在一起
2、顺序表的长度是固定的,但是链表长度不固定
3、顺序表查找方便(下标),但是插入和删除麻烦(post~last),链表,插入和删除方便,查找麻烦
(为什么操作麻烦,为什么操作方便?)