Single linked list exercise

Single linked list exercise

Related content:
1.Re-understanding: LNode, *LinkList
2. Creation of the entire table of a singly linked list (head insertion and tail insertion)
3.Reading, inserting and deleting of a singly linked list< /span>Delete the entire singly linked list
4.

//单链表的初始化、创建、插入、删除、查找
//结点的结构体:数据域、指针域
//使用头指针的指针以便可以不用返回头指针
//初始化:创建头结点、其指针域置空  
//创建(头插法)形参:链表头指针的指针(头插会修改头指针指向)、结点个数,返回头指针
//插入-形参:链表头指针、插入位序、插入元素
//删除-形参:链表头指针、删除位序、无返回
//查找-形参:链表头指针、待查元素、返回位序
//打印-形参:链表头指针
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
    
    
    int data;
    struct Node *next;
}LNode,*LinkList;
//初始化:创建头结点、其指针域置空
void InitLinkList(LinkList *L){
    
    
    //*L用于保存头指针,方便头插时更改头结点中的next指向
    *L=(LNode*)malloc(sizeof(LNode));
    (*L)->next=NULL;
}
//创建(头插法)形参:链表头指针的指针(头插会修改头指针指向)、结点个数,返回头指针
void CreateLinkList(LinkList *L,int n){
    
    
    LNode *p;//定义新建结点
    for (size_t i = 0; i < n; i++)
    {
    
    
        //开辟空间
        p=(LNode*)malloc(sizeof(LNode));
        //输入数据
        printf("输入第%d个结点的数据:",i+1);
        scanf("%d",&p->data);
        //插入前:L A
        //插入后:L p A
        p->next=(*L)->next;
        (*L)->next=p;
    }
}
//插入-形参:链表头指针、插入位序、插入元素
void LinkListInsert(LinkList *L, int i, int e){
    
    
    int j=0;//计数器
    //遍历时使用的指针p,插入结点s
    LNode *p,*s;
    //为插入结点开辟空间
    s=(LNode*)malloc(sizeof(LNode));
    s->data=e;
    p=(*L);//p指向头结点
    while (p!=NULL&&j<i-1)//位序i,下标i-1
    {
    
    
        p=p->next;//后移指针p,直到到达插入位置的前一个位置
        j++;
    }
    //插入操作
    //插入前 p 插入位置 p的下一个结点
    //插入后 p s p的下一个结点
    s->next=p->next;
    p->next=s;
}
//删除-形参:链表头指针、删除位序
void DeleteElem(LinkList *L, int i){
    
    
    int j=0;//计数器
    //遍历时使用的指针p,待删结点q
    LNode *p,*q;
    p=(*L);//p指向头结点
    while (p!=NULL&&j<i-1)//位序i,下标i-1
    {
    
    
        p=p->next;//后移指针p,直到到达删除位置的前一个位置
        j++;
    }
    //删除操作
    //删除前 p 待删除结点 下一个结点
    //删除后 p 待删除结点
    q=p->next;
    p->next=q->next;
    free(q);
}
//查找-形参:链表头指针、待查元素、返回位序
int GetElemPosition(LinkList *L,int e){
    
    
    int i=0;//下标
    //遍历时使用的指针p
    LNode *p;
    p=(*L);//p指向头结点
    while (p!=NULL)
    {
    
    
        if (p->data!=e)
        {
    
    
            p=p->next;
            i++;
        }
    }
    if (p==NULL)//未找到
        return 0;
    return i+1;//下标+1=位序
}
//打印
void PrintLinkList(LinkList *L){
    
    
    //遍历时使用的指针p
    LNode *p;
    p=(*L)->next;//p指向首元结点
    while (p!=NULL)
    {
    
    
        printf("%d ",p->data);
        p=p->next;
    }
}
int main(){
    
    
    int n,i,e;
    LinkList L;
    InitLinkList(&L);
    printf("输入结点个数:");
    scanf("%d",&n);
    CreateLinkList(&L,n);
    PrintLinkList(&L);
    printf("\n输入插入位序及元素:");
    scanf("%d%d",&i,&e);
    LinkListInsert(&L,i,e);
    printf("插入后的链表:");
    PrintLinkList(&L);
    printf("\n输入待删除元素的位序:");
    scanf("%d",&i);
    DeleteElem(&L,i);
    printf("删除指定元素后的链表:");
    PrintLinkList(&L);
    printf("\n输入待查询的元素:");
    scanf("%d",&e);
    i=GetElemPosition(&L,e);
    if (i==0)
    {
    
    
        printf("未查询到该元素!");
    }else{
    
    
        printf("待查询元素的位序为:%d",i);
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_48524215/article/details/134170522