欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言---实现单链表的插入和删除操作

程序员文章站 2022-05-06 09:45:26
...
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode, *LinkList;

LinkList L;//全局变量L;

LinkList  HEAD_INSERT()//头插法
{
    LNode *s;
    int x;
    L=(LinkList)malloc(sizeof(LNode));
    L->next=NULL;//建立头指针
    scanf("%d",&x);
    while(x != 999)
    {
        s=(LinkList)malloc(sizeof(LNode)); //每次申请节点域;
        s->data=x;
        s->next=L->next;
        L->next=s;
        scanf("%d",&x);
    }
    return L;
}
void print_list()
{

    LinkList p;
    p=L->next;//p指向单链表第一个节点
    while( p )
    {
        printf("%5d",p->data);
        p=p->next;
    }
}
LNode  *  get_pre(int i)//获得前驱节点
{
    int j=1;
    LNode *p;
    p=L->next;
    if( i == 0 )
        return L;
    if( i < 0 )
        return NULL;//参数不合法
    while ( p && j < i )
    {
            p=p->next;
            ++j;
    }
    return p;//返回查找到的前驱节点;
}
void   list_insert()//插入链表
{

    int x;
    int i;
    LNode *p,*s;
    s = (LinkList) malloc(sizeof(LNode ));
    printf("请输入要插入的数据:  \n");
    scanf("%d",&x);
    printf("请输入要插入的位置:    \n");
    scanf("%d",&i);
    s->data=x;
    p=get_pre(i-1);//记录要插位置 的前驱节点;
    s->next=p->next;//改变链表指针的指向,实现插入操作;
    p->next=s;//上面一句语句和本行语句顺序不可颠倒,否则断链;


}
void   delete_list()
{
    int i;
    LNode *p;
    LNode *q,*s;
    printf("输入要删除的节点的序号:  \n");
    scanf("%d",&i);
    p=get_pre(i-1);//寻找被删除的节点的前驱;
    s=p->next;//s即为被删除的节点;
    q=p->next->next;//记录被删除节点的后继;
    p->next=q;//改变链指针的指向,删除s
    free(s);//释放被删除节点的空间;
}
int main()
{
    printf("Hello world!\n");
    HEAD_INSERT();
    printf("初始链表为:    \n");
    print_list();
    printf("\n");
    list_insert();
    printf("插入之后的链表:   \n");
    print_list();
    printf("\n");
    delete_list();
    printf("删除之后的链表:  \n");
    print_list();
    printf("\n");
    return 0;
}

C语言---实现单链表的插入和删除操作