单向链表
建立节点
typedef struct node
{
ElemType data;
struct node *next;
}node ;
typedef node * LinkList;
读取链表的值
Status getElem(LinkList L,int i,ElemType *e )//读取链表
{
int j;
LinkList p;
p=L->next;//跳过头节点
j=1;
while(p&&j<i)//找到的i个位置的节点
{
p=p->next;
++j;
}
if(!p||j>i)//i的位置不符合要求
return ERROR;
*e=p->data;//找到节点的值
return OK;
}
插入节点
Status linkinsert(LinkList L,int i,ElemType e)//节点的插入
{
int j;
LinkList p,s;
p=L->next;
j=1;
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;
return OK;
}
节点的删除,注意从p->next开始
Status linkdelte(LinkList L,int i,ElemType *e)//删除节点
{
int j;
LinkList p,q;
p=L->next;
while(p->next&&j<i)
{
p=p->next;
j++;
}
if(!(p->next)||j>i)//元素不存在
return ERROR;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);//释放内存
}
头尾插法建立单向链表
Status linkinsertwei(LinkList L,int a[],int n)//尾插法
{
LinkList s,t;
L=(LinkList)malloc(sizeof(LinkList));//创建空间
L->next=NULL;
t=L;
for(int i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LinkList)); //为新加入的元素开辟空间
s->data=a[i];
s->next=t;
t=s;
}
}
Status linkinserttou(LinkList L,int a[],int n)//头插法建立单向链表
{
LinkList s;//插入节点
L=(LinkList)malloc(sizeof(LinkList));//创建空间
L->next=NULL;
for(int i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LinkList)); //为新加入的元素开辟空间
s->data=a[i];
s->next=NULL;
L->next=s;//加入链表
}
}
双向链表的头尾插法
Status llinktou(linkList L,int a[],int n)//双向链表头插法
{
linkList s;
L=(linkList)malloc(sizeof(LinkList));//开辟空间
L->next=L->pre=NULL;
for(int i=0;i<n;i++)
{
s=(linkList)malloc(sizeof(LinkList));//为元素开辟空间
s->data=a[i];
s->next=L->next;
if(L->next!=NULL)//链表不为空时
{
L->next->pre=s;//链表的前驱指向新节点
}
L->next=s;//L刷新位置
s->pre=L;//新节点指向头节点
}
Status llinkwei(linkList L, int a[],int n)//双向链表尾插法
{
linkList s,t;
L=(linkList)malloc(sizeof(LinkList));//开辟空间
L->next=L->pre=NULL;
t=L;
for(int i=0;i<n;i++)
{
s=(linkList)malloc(sizeof(LinkList));//开辟空间
s->data=a[i];
t->next=s;//尾指针指向新节点
s->pre=t;//新节点的前驱指向链表的尾指针
t=s;//尾指针移到下一个节点
}
t->next=L->next;
}