单链表操作集合

#include <stdio.h>
#include <stdlib.h>
struct Node//单链表定义
{
    ElemType data;
    struct Node*next;
};
void LinkedListInit(LinkedList L)//不带头结点的单链表的初始化
{
    L=NULL;
}
void LinkedListInit2(LinkedList L)//带头节点的单链表初始化
{
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)
    {
        printf("申请空间失败!");
        exit(0);
    }
    L->next=NULL;
}
int LinkedListLength(LinkedList L)//单链表求表长
{
    LNode*p;
    p=L->next;
    int j=0;
    while(p!=NULL)
    {
        j++;
        p=p->next;
    }
    return j;
}
LinkedList LinkListGetINode(LinkedList L,int i)//单链表获取第i个结点元素的操作
{
    LNode*p;
    p=L->next;
    int j=1;
    while((p!=NULL)&&(j<i))
    {
        p=p->next;
        j++;
    }
    return p;
}
void LinkedListInsertQE1(LinkedList L,LinkedList p,ElemType e)//不带头结点的单链表的插入操作
{
   q=(LNode*)malloc(sizeof(LNode));
   if(q==NULL)
   {
       printf("申请空间失败!");
       exit(0);
   }
   q->data=e;
   if(p==L)
   {
       q->next=L;
       L=q;
   }
   else
   {
       pre=L;
       while((pre!=NULL)&&(pre->next!=p))
       pre=pre->next;
       q->next=pre->next;
       pre->next=q;
   }
}
void LinkedListInsertQE2(LinkedList L,LinkedList p,ElemType e)//带头结点的单链表的插入操作
{
    q=(LNode*)malloc(sizeof(LNode))
    {
        if(q==NULL)
        {
            printf("fail!");
            exit(0);
        }
        q->data=e;
        pre=L;
        while((pre!=NULL)&&(pre->next!=p))
            pre=pre->next;
        q->next=pre->next;
        pre->next=q;
    }
}
void LinkedListDeleteQE1(LinkedList L,LinkedList p,ElemType e)//不带头结点的单链表删除操作(若有多个值为e的结点则删除第一次出现的e)
{
    pre=L;
    while((pre!=NULL)&&(pre->next->data!=e))
        pre=pre->next;
    p=pre->next;
    if(p!=NULL)
    {
        if(p==L)
            L=p->next;
        else
            pre->next=p->next;
        free(p);
    }
}
void LinkedListDeleteQE2(LinkedList L,LinkedList p,ElemType e)//带头结点的单链表的删除操作
{
    pre=L;
    while((pre!=NULL)&&(pre->next->data)!=e))
    {
        pre=pre->next;
        p=pre->next;
        if(p!=NULL)
            {
                pre->next=p->next;
                free(p);
            }
    }
}
void LinkedListCreateHeadL(LinkedList L,ElemType a[n])//用头插法创建带头结点的单链表
{
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)
    {
        printf("申请空间失败\n");
        exit(0);
    }
    L->next=NULL;
    for(i=0;i<n;i++)
    {
     p=(LNode*)malloc(sizeof(LNode));
     if(p==NULL)
     {
         printf("申请空间失败!");
         exit(0);
     }
     p->data=a[i];
     p->next=L->next;
     L->next=p;
    }
}
void LinkedListCreateTailL(LinkedList L,ElemType a[n])//用尾插法创建带头节点的单链表
{
    
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)
    {
        printf("申请空间失败\n");
        exit(0);
    }
    L->next=NULL;
    tail=L;
    for(j=0;j<n;j++)
    {
        p=(LNode*)malloc(sizeof(LNode));
        if(p==NULL)
        {
            printf("申请空间失败!\n");
            exit(0);
        }
        p->data=a[i];
        p->next=NULL;
        tail->next=p;
        tail=p;
    }
}
void LinkedListMergeLaLb(LinkedList La,LinkedList Lb,LinkedList Lc)//带头结点的单链表合并操作
{
    pa=La->next;
    pb=Lb->next;
    Lc=La;
    pc=Lc;
    while((pa!=NULL)&&(pb!=NULL))
    {
        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=pa;
    else
        pc->next=pb;
    Lb->next=NULL;
    free(Lb);
}
//单链表常用的排序算法
//冒泡排序
NODE*BubbleSort1(NODE*head)
{
    //冒泡排序(除头结点,单链表至少有一个结点)
    for(NODE*temp=head->next;temp->next!=NULL;temp=temp->next)
    {
        for()
    }
}

下面是一些复习过程中整理的单链表的操作集合

#include <stdio.h>
#include <stdlib.h>
struct Node//单链表定义
{
    ElemType data;
    struct Node*next;
};
void LinkedListInit(LinkedList L)//不带头结点的单链表的初始化
{
    L=NULL;
}
void LinkedListInit2(LinkedList L)//带头节点的单链表初始化
{
    L=(LNode*)malloc(sizeof(LNode));
    if(L==NULL)
    {
        printf("申请空间失败!");
        exit(0);
    }
    L->next=NULL;
}
int LinkedListLength(LinkedList L)//单链表求表长
{
    LNode*p;
    p=L->next;
    int j=0;
    while(p!=NULL)
    {
        j++;
        p=p->next;
    }
    return j;
}
LinkedList LinkListGetINode(LinkedList L,int i)//单链表获取第i个结点元素的操作
{
    LNode*p;
    p=L->next;
    int j=1;
    while((p!=NULL)&&(j<i))
    {
        p=p->next;
        j++;
    }
    return p;
}
void LinkedListInsertQE1(LinkedList L,LinkedList p,ElemType e)//不带头结点的单链表的插入操作
{
   q=(LNode*)malloc(sizeof(LNode));
   if(q==NULL)
   {
       printf("申请空间失败!");
       exit(0);
   }
   q->data=e;
   if(p==L)
   {
       q->next=L;
       L=q;
   }
   else
   {
       pre=L;
       while((pre!=NULL)&&(pre->next!=p))
       pre=pre->next;
       q->next=pre->next;
       pre->next=q;
   }
}
void LinkedListInsertQE2(LinkedList L,LinkedList p,ElemType e)//带头结点的单链表的插入操作
{
    q=(LNode*)malloc(sizeof(LNode))
    {
        if(q==NULL)
        {
            printf("fail!");
            exit(0);
        }
        q->data=e;
        pre=L;
        while((pre!=NULL)&&(pre->next!=p))
            pre=pre->next;
        q->next=pre->next;
        pre->next=q;
    }
}

未完-------

猜你喜欢

转载自blog.csdn.net/zouzou_/article/details/86521254
今日推荐