数据结构基础3_带头结点的单链表

本文介绍了一个简单的单链表数据结构及其基本操作的实现方法,包括初始化、插入、删除等,并通过合并两个有序链表来展示这些操作的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
#define true 1
#define false 0
typedef struct Lnode{
        ElemType data;
        struct Lnode *next;
        }*link,*Position;
typedef struct{
        link head,tail;
        int len;
        }linklist;
        Status Makenode(link &p,ElemType e)
        {
               p=(link)malloc(sizeof(Lnode));
               if(!p)
               {
                     return false;
                     }
                     p->data=e;
                     return true;
                     }
         void Freenode(link &p)
         {
              free(p);
              p=NULL;
              }
          Status Initlist(linklist &L)
          {
             link p;
             p=(link)malloc(sizeof(Lnode));
             if(!p)
             {
                   return false;
                   }
                   p->next=NULL;
                   L.head=L.tail=p;
                   L.len=0;
                   return true;
                   }
            Status Clearlist(linklist &L)
            {
                   link p,q;
                   p=L.head->next;
                   L.head->next=NULL;
                   while(p!=NULL)
                   {
                                 q=p->next;
                                 free(p);
                                 p=q;
                                 }
                                 L.tail=L.head;
                                 L.len=0;
                                 return true;
                                 }                           
             Status Destorylist(linklist &L)
             {
                Clearlist(L);
                free(L.head);
                L.head=L.tail=NULL;
                L.len=0;
                return true;
                }
                Status Insfirst(linklist &L,link h,link s)
                {
                       h=L.head;
                    s->next=h->next;
                    h->next=s;
                    
                    L.len++;
                    return true;
                    }
                Status Delfirst(linklist &L,link h,link q)
                {
                        h=L.head;
                       if(h->next==NULL)
                       {
                                       return false;
                                       }
                                       q=h->next;
                                       h->next=q->next;
                                       free(q);
                                       L.len--;
                                       return true;
                                       }
                Status Append(linklist &L,link s)
                {
                   int n=1;
                  link p;
                  p=L.head;
               while(p->next!=NULL)
{
                  p=p->next;
}
                   p->next=s;
                   while(s->next!=NULL)
                   {
                       s=s->next;
                       n++;
                       }
                       L.tail=s;
                       L.len+=n;
                       }
                 Status Remove(linklist &L,link &q)
                 {
                        link p;
                        p=L.head;
                        if(L.head==L.tail)
                        {
                                          return false;
                                          }
                         q=L.head;
                         while(q->next!=NULL)
{
                              q=q->next;
}
                         while(p->next!=q)
                         {
                              p=p->next;
                              }
                              p->next=q->next;
                              L.tail=p;
                              L.len--;
                              return true;
                              }
                 Status Insbefore(linklist &L,link &p,link s)
                 {
                     link q=L.head;
                     while(q->next!=p)
                     {
                         q=q->next;
                         }
                         s->next=q->next;
                         q->next=s;
                         p=s;
                         L.len++;
                         return true;
                         }
                 Status Insafter(linklist &L,link &p,link s)
                 {
                        s->next=p->next;
                        p->next=s;
                        if(p==L.tail)
                        {
                                     L.tail=s;
                                     }
                        p=s;
                        L.len++;
                        return true;
                        }
                 Status Setcurelem(link &p,ElemType e)
                 {
                   p->data=e;
                   return true;
                   }
                   ElemType Getcurelem(link p)
                   {
                            return p->data;
                            return true;
                            }
                   Status Listempty(linklist L)
                   {
                          if(L.head->next==NULL)
                          {
                                                return true;
                                                }
                                                else
                                                {
                                                    return false;
                                                    }
                                                    }
                  int Listlength(linklist &L)
                  {
                    return L.len;
                    }
                  Position Gethead(linklist L)
                  {
                    return L.head;
                    }
                    Position Getlast(linklist L)
                    {
                             return L.tail;
                             }
                   Position priorpos(linklist L,link p)
                   {
                            link pre=L.head;
                            while(pre->next!=p)
                            {
                                   pre=pre->next;
                                   }
                            if(L.head==pre)
                            {
                               return NULL;
                               }
                               return pre;
                               }
                   Position Nextpos(linklist L,link p)
                   {
                         /*
                           if(L.tail==p)
                           {
                                       return NULL;
                                       }*/
                                       return p->next;
                                       }
                  Status Locatepos(linklist L,int i,link &p)
                  {
                         if(i<0||i>L.len)
                         {
                                         return false;
                                         }
                       p=L.head;
                       while(i!=0)
                       {
                                  i--;
                                  p=p->next;
                                  }
                                  
                                  return 1;
                                  }
                     int compare(ElemType e1,ElemType e2)
                     {
                         if(e1>e2)
                         {
                                  return 1;
                                  }
                                  if(e1==e2)
                                  {
                                            return 0;
                                            }
                                            else
                                            {
                                                return -1;
                                                }
                                                }
                                  
                  Position Locateelem(linklist L,ElemType e,Status compare(ElemType,ElemType))
                  {
                           int j;
                           link p;
                           p=L.head->next;
                           for(int i=0;i<L.len;i++)
                           {
                                   if(compare(e,p->data)==0)
                                   {
                                       return p;
                                       }
                                       p=p->next;
                                       }
                                       return NULL;
                                       }
                                       Status visit(link p)
                                       {
                                            printf("%d",p->data);
                                            }
                 Status Listtraverse(linklist &L,Status visit(link p))
                 {
                     link p=L.head->next;
                     while(p!=NULL)
                     {
                                         visit(p);
                                         p=p->next;
                                         }
                                         return true;
                                         }
                 Status Listinsert(linklist &L,int i,ElemType e)
                 {
                        link h,s;
                        if(!Locatepos(L,i-1,h))
                        {
                                               return false;
                                               }
                        if(!Makenode(s,e))
                        {
                           return false;
                           }
                        if(h==L.tail)
{
L.tail=s;
}
                        Insfirst(L,h,s);
                        return true;
                        }
                        
                  void mergelist(linklist &La,linklist &Lb,linklist &Lc)
                  {
                         link pa,pb,pc;
                               pa=La.head->next;
     pb=Lb.head->next;
     Lc.head=pc=La.head;
     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;
                        }
                        }
                        if(pa==NULL)
                      {
                         pc->next=pb;
                       }
                        else
                         {
                        pc->next=pa;
                           }
                        
                        }                                          
                                                                             
                       
                    
             
#include<stdio.h>
#include<stdlib.h>
int main()
{
    linklist La;
	Initlist(La);
	Listinsert(La,1,7);
	Listinsert(La, 2, 5);
	Listinsert(La, 3, 2);
	Listinsert(La, 4, 1);
	
	linklist lb;
    Initlist(lb);
	Listinsert(lb,1,39);
	Listinsert(lb,2,19);
	Listinsert(lb,3,9);
	Listinsert(lb,4,3);
	/*
	link h,q,k;
	 
	Delfirst(La,h,q); 
	
	Remove(La,k);*/
	linklist lc;
	mergelist(La,lb,lc);
	Listtraverse(lc,visit);
	printf("\n");
	system("pause");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值