单链表结构:
typedef struct node
{
int data;
struct node *next;
}node;
typedef struct node *LinkList;
/*创建单链表,将新的节点插入到链表的尾部*/
createList(LinkList L, int n)
{
LinkList p,r; //p节点用来接收插入的元素,r是尾节点
int i;
srand(time(0));
L=(LinkList)malloc(sizeof(node));
r=L->next; //r指向L的尾部
for(i=0;i<ni++)
{
p=(LinkList)malloc(sizeof(node));
p->data=rand()%100+1;
r->next=p; //r指向P
r=p; //将r指向新的尾节点
}
r->next=NULL;
return 0;
}
//get the element in the location i
GetElem(LinkList L, int i, int *e)
{
 LinkList p; //定义一个指向节点的指针
 p=L->next; //p指向链表的第一个节点
 int j=1;
 while(p&&j<i)
 {
 p=p->next; //如果P不为空(没有到链表尾部)或者计数器仍然没有到i则p就往前一步
 j++;
 }
 if(j<i||!p)
 return 0;
 *e=p->data;
 return 0;
}
//链表插入,将e插入链表的第i个位置
void ElemInsert(LinkList L, int i, int e)
{
 LinkList p,s;
 int j=1;
 //首先找到
 p=L->next;
 while(p&&j<i)
 {
 p=p->next;
 j++;
 }
 //生成一个新节点
 s=(LinkList)malloc(sizeof(Node));
 s->data=e;
 s->next=p->next;
 p->next=s;
}
//链表删除,删除第i+1个节点
void ElemDelete(LinkList L, int i, int e)
{
 LinkList p,q;
 int j=1;
 p=L->next;
 while(p&&j<i)
 {
 p=p->next;
 j++
 }
 //考虑一些可能出错的情况
 q=p->next;
 p->next=q->next;
 e=q->data;
 free(q); /很重要
}