单链表(C语言实现)

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType;
typedef struct Node
{
    DataType data;                 //    数据域 
    struct Node * next;            //    指针域 
    
}LinkList;

LinkList * Creat_List(int a[], int n);               //    创建链表 
bool Empty_List(LinkList * L);                       //    判空 
int Length_List(LinkList * L);                       //    链表长度 
void Traverse_List(LinkList * L);                    //    遍历 
int Locate_List(LinkList * L, DataType x);           //    按值查找 
bool Get_List(LinkList * L, int pos, DataType * x);  //    按位查找 
bool Insert_List(LinkList * L, int pos, DataType x); //    插入 
bool Delete_List(LinkList * L, int pos, DataType *x);//    删除 
bool Destroy_List(LinkList * L);                     //    销毁链表 

int main()
{
    DataType x,val;
    int a[5] = {12, 24, 33, 56, 78};
    
    LinkList * L = Creat_List(a,5);
    printf("链表元素:");
    Traverse_List(L);
    
    if(Insert_List(L, 2, 45))
    { 
        printf("\n插入成功!\n");
        printf("插入元素:45");
        printf("\n插入位置:第2个结点\n"); 
    }     
    else
        printf("\n插入失败!\n");
    printf("链表元素:");
    Traverse_List(L);
    
    if(Delete_List(L, 2, &val))
    {
        printf("\n删除成功!\n");
        printf("删除元素:%d\n",val);
        printf("删除位置:第2个结点\n");
    }
    else
        printf("\n删除失败!\n");
    printf("链表元素:");
    Traverse_List(L);
    
    printf("\n按值查找的元素:33");
    printf("\n按值查找元素的位置序号:%d\n\n",Locate_List(L,33));
    
    if(Get_List(L, 4, &x))
    {
        printf("按位查找成功!\n");    
        printf("按位查找的元素:%d\n",x);
        printf("按位查找的位置:第4个结点\n");
    }
    else    
        printf("查找失败!\n");
    
    printf("\n链表长度:%d\n",Length_List(L));
    printf("\n链表元素:");
    Traverse_List(L);
    
    return 0;
}
LinkList * Creat_List(int a[], int n)
{
    int i;
    LinkList * L = (LinkList*)malloc(sizeof(LinkList));//    创建一个头结点,返回头结点的地址 
    if(!L)
    {
        printf("申请空间失败!\n");
        exit(-1);
    }
    LinkList * Tail = L;    //    创建一个尾指针,指向头结点 
    Tail->next = NULL;
    for(i = 0; i<n; ++i)
    {
        printf("第%d个结点的值:",i+1);
        printf("%d",a[i]);
        LinkList * p = (LinkList*)malloc(sizeof(LinkList));
        p->data = a[i];
        Tail->next = p;
        p->next = NULL;
        Tail = p;
        printf("\n");
    }
    printf("单链表创建成功!\n");
    return L;
}
bool Empty_List(LinkList * L)
{
    if(L->next==NULL)    //    头结点指针域为空,为空表 
        return true;
    else
        return false;
}
int Length_List(LinkList * L)
{
    int cnt = 0;
    LinkList * p = L->next;
    while(p!=NULL)
    {
        cnt++;
        p = p->next;
    }
    return cnt;
}
void Traverse_List(LinkList * L)
{
    LinkList * p = L->next;
    while(p!=NULL)
    {
        printf("%3d",p->data);
        p = p->next;
    }
    printf("\n");
    return;
}

int Locate_List(LinkList * L, DataType x)
{
    int pos = 1;
    LinkList * p = L->next;
    while(p->data!=x&&p!=NULL)
    {
        pos++;
        p = p->next;
    }
    if(p!=NULL)
        return pos;
    else
        return 0;
}

bool Get_List(LinkList * L, int pos, DataType * x)
{
    int i = 1;
    LinkList * p = L->next;
    if(pos<1||pos>Length_List(L))
        return false;
     while(i<pos&&p!=NULL)
     {
         i++;
         p = p->next;
    }
    if(p!=NULL)
    {
        *x = p->data;
        return true;    
    }
    else
        return false;
} 

bool Insert_List(LinkList * L, int pos, DataType x)
{
    int i = 1;
    LinkList * p = L->next;
    if(pos<1||pos>Length_List(L))
        return false;
    while(i<pos-1&&p!=NULL)
    {
        i++;
        p = p->next;
    }
    if(p!=NULL)
    {
        LinkList * q = (LinkList *)malloc(sizeof(LinkList));
        if(!q)
        {
            printf("申请空间失败!\n");
            exit(-1);
        }
        q->data = x;
        q->next = p->next;
        p->next = q;
        return true;
    }
    else
        return false;
}

bool Delete_List(LinkList * L, int pos, DataType * x)
{
    int i = 1;
    LinkList * p = L->next;
    if(Empty_List(L))
        return false;
    if(pos<1||pos>Length_List(L))
        return false;
    while(i<pos-1&&p!=NULL)
    {
        i++;
        p = p->next;
    }
    if(p!=NULL)
    {
        LinkList * q = p->next;
        *x = q->data; 
        p->next = q->next;
        free(q);
        return true;
    }
    else
        return false;
}
bool Destroy_List(LinkList * L)
{
    LinkList * p = L;
    if(Empty_List(L))
        return false;
    while(p!=NULL)
    {
        p = p->next;
        free(L);
        L = p;
    }
    L = p = NULL;    // 防止产生野指针 
    return true;
}

猜你喜欢

转载自blog.csdn.net/Mr_Morgans/article/details/120981791