链表详解自带代码
单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。
下面就是单链表例子:
举个简单例子:链表就跟铁链一样
与数组不同,我们无法在常量时间内访问单链表中的随机元素。 如果我们想要获得第 i 个元素,我们必须从头结点逐个遍历。 我们按索引来访问元素平均要花费 O(N) 时间,其中 N 是链表的长度。
众所周知,我们使用头结点来代表整个列表。
因此,在列表开头添加新节点时更新头结点 head 至关重要。
- 初始化一个新结点 cur;
- 将新结点链接到我们的原始头结点 head。
- 将 cur 指定为 head。
头插法
LinkList Creat_listhead(LinkList &head)
{
Status count=0,i=0;
LinkList p;
head=(LinkList)malloc(sizeof(LNode));
head->next=NULL;
printf("请输入表的节点数:\n");
scanf("%d", &count);
for (i = count; i >0;--i)
{
p = (LinkList)malloc(sizeof(LNode)); // 为新结点开辟新内存
scanf("%f",&p->data);
p->next =head->next;
head->next=p;
}
}
尾插法
LinkList Creat_listtail(LinkList &head)
{
LinkList q,node;
Status count=0,i=0;
head=(LinkList)malloc(sizeof(LNode));// 为头指针开辟内存空间
q=head;
q->next=NULL;
printf("请输入表的节点数:\n");
scanf("%d", &count);
for (i = 0; i < count;i++)
{
node = (LinkList)malloc(sizeof(LNode)); // 为新结点开辟新内存
scanf("%f",&node->data);
q->next = node;
q=node;
}
node->next = NULL;
}
插入一个元素
Status ListInsert_L(LinkList &L,Status i,ElemType e)
{
//在带头节点的单链线性表L中的第i个位置之前插入元素e
LinkList p,s;
Status j=0;
p=L;
j=0;
while(p&&j<i-1)
{
p=p->next;//寻找第i个节点
++j;
}
if(!p||j>i-1)//i小于1或者大于表长加1
{
return ERROR;
}
s=(LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
删除一个元素
Status ListDelete_L(LinkList &L,Status i,ElemType &e)
{
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p,q;
Status j=0;
p=L;
while(p->next&&j<i-1)
{
p=p->next;
++j;
}
if(!(p->next)||j>i-1)
{
return ERROR;//删除位置不合理
}
q=p->next;
p->next=q->next;//删除并释放结点
e=q->data;
free(q);
return OK;
}
合并链表
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
//已知线性表La和Lb的元素安值非递减排列
LinkList pa,pb,pc;
pa=La->next;
pb=Lb->next;
Lc=pc=La;//用La的头节点作为Lc的头结点
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;//插入剩余段
free(Lb);
}
显示链表元素
void printlist(LinkList L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
printf("%4.2f ",p->data);
p=p->next;
}
}
对链表进行查找
Status ListSearch_L(LinkList L,ElemType e,Status &i)
{
while(L!=NULL)
{
if(L->data==e)
{
return 0;
}
i++;
L=L->next;
}
return 0;
}
下面是完成的代码:可以免费下载
代码下载
别废话,拿你代码给我看。