链表详解自带代码

单链表中的每个结点不仅包含值,还包含链接到下一个结点的引用字段。通过这种方式,单链表将所有结点按顺序组织起来。
下面就是单链表例子:
举个简单例子:链表就跟铁链一样
与数组不同,我们无法在常量时间内访问单链表中的随机元素。 如果我们想要获得第 i 个元素,我们必须从头结点逐个遍历。 我们按索引来访问元素平均要花费 O(N) 时间,其中 N 是链表的长度。
众所周知,我们使用头结点来代表整个列表。
因此,在列表开头添加新节点时更新头结点 head 至关重要。

  1. 初始化一个新结点 cur;
  2. 将新结点链接到我们的原始头结点 head。
  3. 将 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; 
}

下面是完成的代码:可以免费下载
代码下载

发布了31 篇原创文章 · 获赞 6 · 访问量 923

猜你喜欢

转载自blog.csdn.net/qq_44797965/article/details/103681614