获取元素:
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; //定义链表,p是个指向一个结点的指针
p=L->next; // 让P指向链表L的第一个结点
j=1; //当前位置计数器初始化为1
while( p && j<i) //p不能为空(p为空就是null,即链表的尾部)j<i表示未找到
{
p=p->next;
++j;
}
if( !p || j>i ) //1.如果到链表的结束还没有找到,则p=null,!p为真,所以返回error
{
return ERROR;
}
*e = p->data;
return OK;
}
插入数据:
//思路:
//1.声明结点p指向链表的第一个结点,初始化j=1
//2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1
//3.若链表末尾p为空,则说明第i个元素不存在;
//4.否则查找成功。在系统中生成一个空节点s;
//5.将数据e赋值给s->data;
//6.标准语句: s->next=p->next;p-next=s;
Status ListInsert(LinkList *L ,int i ,ElemType e)
{
int j;
LinkList p,s;
p=L->next;
j=1;
while( p && j<i ) //用于寻找第i个结点
{
p=p->next;
j++;
}
if( !p || j>i )
{
return ERROR;
}
s=(LinkList)malloc(sizeof(Node)); //动态分配空间,定义一个名为Nod的LinkList指针变量
s->data=e;
s->next=p->next;
p-next=s;
return OK;
}
删除数据:
//思路:
//1.声明结点p指向链表的第一个结点,初始化j=1
//2. 当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1
//3.若链表末尾p为空,则说明第i个元素不存在;
//4.否则查找成功。将想要删除的结点删除 p->next=p->next->next;
//5.将q结点中的数据赋给e,作为返回;
//6.释放结点q
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j=0;
LinkList p,q;
p=*L;
j=1;
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)
return OK;
}
头插法:
//单链表整表的创建
//思路:
//1.声明一结点p和计数变量i;
//2.初始化空链表L;
//3.让L头结点的指针指向null,即建立一个带头结点的单链表
//4.循环实现后继结点的赋值和插入
//头插法: 就是将新结点插入到当前链表的表头上,直到结束为止
//简单的说,就是把新加进的元素放在表头后的第一个位置:先让新结点的next指向头结点之后,然后让表头的next指向新结点
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;
}
}
尾插法:
单链表整表的创建
//思路:
//1.声明一结点p和计数变量i;
//2.初始化空链表L;
//3.让L头结点的指针指向null,即建立一个带头结点的单链表
//4.循环实现后继结点的赋值和插入
//尾插法: 在链表的尾部增加新的结点
void CreateListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(0));
*L = (LinkList) malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p = (Node *)malloc(sizeof(Node));
p->data = rand()%100+1;
r->next = p;
r = p;
}
r->next= null;
}