下面是单链表基本操作的代码汇总
//线性表单链表存储结构
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
typedef struct Node *LinkList;
//单链表读取
Status GetElem(LinkList L,int i,ElemType *e)
{
int cnt=1;
LinkList p; //指针p
p=L->next; //p指向链表L的第一个结点
while(p&&cnt<i){
p=p->next;
++cnt;
}
if(!p||cnt>i)
return ERROR;
*e=p->data;
return OK;
}
//单链表插入
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j=1;
LinkList p,s;
p=*L;
while(p&&j<i){
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s; //p的后继结点改成s的后继结点,再让s变成p的后继结点
return OK;
}
//单链表删除
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j=1;
LinkList p,q;
p=*L;
while(p->next&&j<i){
++j;
}
if(!(p->next)||j>i)
return ERROR;
q=p->next;
p->next=q->next;
*e=q->data;
free(q); //标准库函数,释放内存
return OK;
}
//单链表的整表创建(头插法)
void CreateListHead(LinkList *L,int n)
{
LinkList p;
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
*L->next=NULL;
for(i=0;i<n;i++){
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
}
//单链表的整表创建(尾插法)
void CreateListHead(LinkList *L,int n)
{
LinkList p,r;
int i;
srand*time(0);
*L=(LinkList)malloc(sizof(Node));
r=*L; //r为指向尾部的结点
for(i-0;i<n;i++){
p=(Node *)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p; //将表尾终端结点的指针指向新结点
r=p; //将当前的新结点定义为表尾终端结点
}
r->next=NULL;
}
//单链表的整表删除
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;
while(p){
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
return OK;
}