这里是带表头的单链表的操作(急急忙忙补档)
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int Element;//数据域
struct Node* Next;//指针域
};
typedef struct SingleList
{
struct Node* First;//头指针
int n;//表长
};
bool SingleListInit(SingleList *L)
{
L->First=(Node*)malloc(sizeof(Node));//头指针指向第一个节点
if(!L->First)//如果分配失败报错
return false;
L->First->Next=NULL;//结点无直接后继
L->n=0;//表长0
return true;
}
bool SingleListInsert(SingleList* L,int i,int Element)
{
int j;
Node *p,*q;
if(i<0||i>L->n)//因为带表头,所以检验的全部后移1
return false;
p=L->First;//p指针从头元素开始,寻找被插入元素的直接前驱
for(j=0;j<i;j++)//因为表头直接可以作为直接前驱,所以不必分情况
p=p->Next;
q=(Node*)malloc(sizeof(Node));//为新建节点分配空间
q->Next=p->Next;//首先获取新节点的直接后继
p->Next=q;//再获取直接前驱,防止直接后继的数据被新节点指针覆盖断链
q->Element=Element;
L->n++;
return true;
}
bool SingleListDelete(SingleList *L,int i)
{
int j;
Node *p,*q;
if(i<-1||i>L->n-1)
return false;
p=L->First;
for(j=0;j<i;j++)
p=p->Next;
q=p->Next;
p->Next=q->Next;
free(q);
return true;
}