一 准备
#include <stdio.h>
#include <stdlib.h>
#define Status int
#define ElemType int
#define OK 1
#define ERROR 0
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
二 进行对链表的操作
1.初始化一个大小为n的链表
void CreateList_L(LinkList &L, int n)
{
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;//定义一个空的指针
for (int i=1; i<=n; i++)
{
//向L内添加n个元素
LinkList p = (LinkList)malloc(sizeof(LNode));
scanf("%d",&p->data);
p->next = L->next;
L->next = p;
}
}
不断更新L指向的节点,并用新节点去指向该节点
2. 读取第i个元素
Status GetElem_L(LinkList L,int i,ElemType &e)
{
//p是头指针,头指针相当于第0个元素,在这里面是恒为0
LinkList p = L->next;
int j = 1;
while (p&&j<i)
{
p = p->next;
++j;
}
if(!p||j>i) return ERROR;//如果p为空节点或者超出范围,报错
e = p->data;//用e返回这个值
return OK;
}//用e返回第i个元素
3.在第i个元素处插入e
Status ListInsert_L(LinkList &L, int i, ElemType e)
{
LinkList p = L;
int j = 0;
while (p&&j<i-1)
{
p = p->next;
++ j;
}//用p指向第i-1个节点
if(!p||j>i) return ERROR;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data = e;//s的data设为e
s->next = p->next;//用s去继承p的指向
p->next = s;//s自己成为p的指向
return OK;
}
4.遍历链表
void LookAll(LinkList L)
{
LinkList p = L;
while (p->next!=NULL)
{
p=p->next;
printf("%d ",p->data);
}
// printf("%d ",p->data);
}
5. 删除第i个元素
Status ListDelete_L(LinkList &L,int i,ElemType &e)
{
LinkList p = L;
int j = 0;
while (p->next&&j<i-1)
{
p = p->next;
++j;
}
if(!p->next&&j>i-1) return ERROR;
LinkList q = p->next;
p->next = q->next;
e = q->data;
free(q);//释放该节点
return OK;
}
三 主函数验证
int main()
{
LinkList List;
CreateList_L(List, 5);
ListInsert_L(List, 3, 88);
int e;
GetElem_L(List, 3, e);
ListDelete_L(List, 3, e);
LookAll(List);
}