/**************************
线性表的链式存储结构
功能代码包含:
1)单链表的数据结构定义
2)单链表的整表创建--初始化
3)单链表的整表删除
4)从单链表中获取元素
5)从单链表中插入元素
6)从单链表中删除元素
注意:代码不进行debug,只实现基本功能
Author:tmw
date:2018-3-9
**************************/
#include <stdio.h>
#include <stdlib.h>
#define error -65530
#define ok 0
/**单链表数据结构定义**/
typedef struct node
{
int data;
struct node *next;
}node;
typedef struct node *Linklist;
/**单链表整表的创建**/
//创建长度为n的单链表
void create_full_linklist( Linklist *L, int n )
{
Linklist p;
*L = (Linklist)malloc(sizeof(node));
(*L)->next = NULL;
int i;
for( i = 0; i < n; i++ )
{
p = (Linklist)malloc(sizeof(node));
p->data = i; //数据初始化
//头插法
p->next = (*L)->next;
(*L)->next = p;
}
}
/**单链表整表的删除**/
void delete_full_Linklist( Linklist *L )
{
Linklist p,q;
p = (*L)->next;
while( p )
{
q = p->next;
free(p);
p = q;
}
(*L)->next = NULL;
}
/**从单链表中获取元素**/
/**获取单链表第i个位置上的元素**/
int getElement_from_Linklist( Linklist *L, int i )
{
int j=1;
Linklist p;
p = (*L)->next;
while( p && j < i)
{
p = p->next;
j++;
}
/**第i个结点不存在的情况**/
if( j > i || !p )
return error;
return p->data;
}
/**往单链表中第i个位置插入元素e**/
int insertElement_for_Linklist( Linklist *L, int i, int e )
{
Linklist p;
int j = 1;
/**找位置i**/
p = (*L)->next;
while( p && j < i-1) //循环走完后,若找到,则p指向i-1的位置,接下来的元素只需插在p之后就行
{
p = p->next;
j++;
}
if( !p || j > i-1 )
return error;
Linklist q;
q = (Linklist)malloc(sizeof(node));
q->data = e;
q->next = p->next;
p->next = q;
return ok;
}
/**从单链表中删除第i个位置上的元素,并返回**/
int deleteElement_from_Linklist( Linklist* L, int i )
{
int j = 1;
Linklist p;
p = (*L)->next;
while( p && j < i-1 )
{
p = p->next;
i++;
}
if( !p || i > j )
return error;
/**删除结点操作**/
Linklist q;
q = p->next;
p->next = q->next;
/**此时q指向第i个位置**/
int e = q->data;
free(q);
return e;
}
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙