目录
一、单链表定义
1.结构体定义
typedef struct LNode{
ElemType data;
LNode *next;
}LNode,*LinkList; //LNode 的时候可以看做是一个结点,LinkList看做是链表头结点代表一个链表
二、操作函数(以带有头结点链表为例)
1.创建一个链表:使用函数返回一个头结点指针即可
LinkList CreatLinkList()
{
LNode *HeadNode = (LNode*)malloc(sizeof (LNode));
HeadNode->data=NULL;
HeadNode->next=NULL;
return HeadNode;
}
2.创建一个结点:类似于创建一个链表(头结点),原理一样
LNode *CreatNewNode(ElemType e){
LNode *NewNode = (LNode*)malloc(sizeof (LNode));
NewNode->data = e;
NewNode->next=NULL;
return NewNode;
}
3.头插法建立一个单链表
void CreatListByHead(LinkList &l)
{
int x;
cout<<"请输入你要插入的元素,输入888退出"<<endl;
cin>>x;
//输入888时停止插入
while (x!=888) {
LNode*NewNode= CreatNewNode(x); //创建一个值为x的新结点
NewNode->next=l->next;
l->next=NewNode;
cin>>x;
}
}
4.尾插法建立单链表
void CreatListByTail(LinkList &l)
{
int x=0;
LNode *t =l; //尾插法时,避免每次都遍历到最后一个结点,使用这个t为尾指针始终指向尾结点,方便插入
cout<<"请输入你要插入的元素,输入888退出"<<endl;
cin>>x;
while (x!=888) {
LNode*NewNode= CreatNewNode(x);
t->next=NewNode;
t=NewNode;
cin>>x;
}
}
5.按照序号返回结点,0看做头结点,1位元素结点
LNode *GetElem(LinkList l, int i)
{
if(i==0) return l; //0 返回头结点
if(i<0) return NULL;
LNode *p = l->next; //让p指向第一个元素结点
for(int j=1;j<i;j++) //这里可以想象,假设i=1的时候,就进不去这个循环,直接返回p,p已经指向第一个结点
p=p->next;
return p;
}
6.按照元素值返回第一个为该值的结点
LNode *locateElem(LinkList l, ElemType e)
{
LNode *p=l->next; //p指向第一个元素
while (p!=NULL and p->data!=e)
p=p->next;
return p;
}
7.在第i个位置,插入结点
bool LinkListInsert(LinkList &l, int i, ElemType e)
{
LNode *p = GetElem(l,i-1); //在第i个位置插入,需要找到第i-1个结点
LNode *NewNode = CreatNewNode(e);
NewNode->next = p->next;
p->next = NewNode;
return true;
}
8.删除第i个结点,并用e返回该节点值
bool LinkListDelete(LinkList &l, int i, ElemType &e)
{
if(i<1) return false;
LNode *p=GetElem(l,i-1);//找到第i-1结点
e=p->next->data;//用e返回要删除的结点值
LNode *q =p->next;//临时存储要删除结点,以便后续free
p->next = q->next;
free(q );
}
9.求表长
int GetLinkListLen(LinkList l)
{
int i=0;
LNode *p=l;
while (p->next!=NULL) {
i++;
p=p->next; //这里注意顺序,先增长再移动
}
return i;
}