一、定义
链表的头文件:
#include< stdlib>
链表的建立:
struct LinkList
{
int data;
struct LinkList *next;
}
二、创建
头插法:
//头插法建立带头结点的单链表
LinkList create1(LinkList &L){
LinkList *s;
int x;
L=(LinkList*) malloc( sizeof(LinkList));//创建头结点
L->next = NULL; //初始化
printf("往链表中添加数据,99999结束\n");
scanf("%",&x);
while(x!=99999){
s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
s->data = x;
s->next = L->next;
L->next = s;
scanf("%d",&x);
}
return L;
}
尾插法:
//尾插法建立单链表
LinkList create2(LinkList &L){
int x;
L=(LinkList*) malloc( sizeof(LinkList ));//创建尾结点
LinkList *s,*r = L;//S为插入节点指针,r为尾指针
printf("往链表中添加数据,99999结束\n");
//scanf("%",&x);
while(x!=99999){
s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
scanf("%d",&x);
s->data = x;
r->next = s;
r = s; //r指向新的表尾
}
r->next = NULL;//尾节点指针置空
return L;
}
三、查找
按值查找:
LinkList *locateElem(LinkList L, int e){
LinkList *P = L->next;
while (P!=NULL && P->data!=e){
P = P->next;
}
return P;//失败则返回空指针
}
按序号查找:
LinkList *getElem(LinkList L, int i){
int j = 1;
LinkList *P = L->next;
if(i == 0)
return L; //如果i=0,则返回头结点
if(i < 0)
return NULL; //错误序号则返回NULL
while(P && j<i)//P非空
{
P= P->next;
j++;
}
return P;
}
四、求表长
void get_len( LinkList *head )
{
LinkList *p = head->next ;
int len = 0;
while ( p )
{
len++;
p = p->next;
}
head->data = len ; //存储长度到头结点
}
五、插入
//插入节点算法(后插,前插一般不考虑)
//指定位置插入节点
int insertElem(LinkList L,int i,int e){
if (i<=1 || i>getLength(L))
{
return 0;
}
else
{
LinkList *s,*p;
p = getElem(L,i-1);//获取插入位置前驱
s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
s->data = e;
s->next = p->next;//此句和下面那句代码不可颠倒,单链表只可找到后继,所以后继指针不能被先覆盖
p->next = s;
return 1;
}
}
//插入节点算法2
//只交换数据,不改变指针,在已知节点位置的基础上这个是最优算法
int insertElem(LinkList L,int i,int e){
int temp;
if (i<=1 || i>getLength(L))
{
return 0;
}
else
{
LinkList *s,*p;
p = getElem(L,i);//获取插入位置
s = (LinkList*)malloc(sizeof(LinkList));//创建新节点
s->data = e;
s->next = p->next;
p ->next = s;
temp = p->data;//这里做个数据交换
p->data = s->data;
s->data = temp;
return 1;
}
}
六、删除
// 删除全部链表
void free_link ( LinkList *h )
{
LinkList *p ;
while ( h )
{
p = h ; //记下要释放的结点
h = h->next ; //表头指针指向下一个结点
free(p);//释放当前结点
}
}
//删除指定的元素
LinkList *deletenode(LinkList *head,int m){
LinkList *p,*q,*s;
p = head;
q = head->next;
while(q){
if(q->data == m){
p->next = q->next;
s = q;
q = q->next;
free(s);
}else{
p = p->next;
q = q->next;
}
}
return head;
}
七、输出
void output (LinkList *h )
{
LinkList *p = h->next ; //p指向第一个数据结点
while ( p )
{
printf("data=%d\n" , p->data ); //输出结点数据
p = p->next ; //数据指针指向下一个结点
}
}