基于C语言的单向链表按“索引”插入或者删除某节点实现

正文

        在学习学堂在线西安科技大学的数据结构与算法课程后,我基于课程的伪代码实现了单向链表的插入和删除操作。以下代码展示了如何建立一个带有一个空数据头结点和五个数据节点的单向链表,以及如何在链表的指定索引位置插入和删除节点。

        以下是完整的代码实现:

#include 
#include 

//结构体声明
typedef struct LNode{
    int data;//链表节点数据域
    struct LNode* next;//链表节点指针域
}LNode;

//函数声明
LNode* CreateFromHead();//用于创建链表,并返回指向链表空数据节点的指针
void printList( LNode* head) ;// 打印链表
void FreeList( LNode* head) ;//下列函数用于释放单向链表的内存
void insertAtIndex(LNode* head,  int index, char data);//按索引插入
void deleteAtIndex(LNode* head,  int index);//按索引删除

//主函数
int main(int argc,char* argv[])
{
    LNode* head; //声明一个指向链表节点的指针
    head = CreateFromHead(); // 将指针head指向新建的链表
    printf("建立的链表如下:\n");
    printList(head);
    printf("将字符‘t'插入链表的第三个节点:\n");
    insertAtIndex(head,3,'t');//将字符‘t'插入链表的第三个带有数据的节点
    printList(head);
    printf("将链表的第4个节点删除:\n");
    deleteAtIndex(head,4);
    printList(head);
    FreeList(head);
    return 0;
}

//按索引插入链表节点
void insertAtIndex(LNode* head,  int index, char data)
{
    LNode* s = (LNode*)malloc(sizeof(LNode));//用指针s指向新建链表节点
    s->data = data;//将新建节点的数据置为data
    int i = 0;//计数器,用于统计指向第几个带数据的链表节点
    while(i != index)
    {
        if( i == (index-1))//如果head指向第(index -1)个节点
        {
            s->next = head->next;//令新建节点的尾指针指向原链表的第index个数据节点
            head->next = s;//令原链表的第(index-1)个数据节点的尾指针指向新建节点
            s  =NULL;
        }
        head = head->next;//指针head后移一个节点
        i++;   
    }
}

//按索引删除链表节点
void deleteAtIndex(LNode* head,  int index)
{
    LNode* s;//声明一个指针,用于指向待删除节点
    int i = 0;//计数器,用于统计指向第几个带数据的链表节点
    while(i != index)
    {
        if( i == (index-1))//如果head指向第(index -1)个节点
        {
            s = head->next;//将s指向要删除的节点
            head->next = s->next;//将head指向的节点的尾指针指向待删除节点的后一个节点
            free(s);//释放要删除的节点的内存
            s = NULL;//将s置为NULL,防止指针悬挂
        }
        head = head->next;//指针head后移一个节点
        i++;   
    }
}

//创建链表,并返回指向链表空数据节点的指针
LNode* CreateFromHead()//用于创建链表,并返回指向链表空数据节点的指针
{
    LNode* L;
    LNode* s;
    char c;
    int flag = 1;
    L = (LNode*)malloc(sizeof( LNode));
    L->next = NULL;
    L->data = '\0';
    printf("请输入存入链表的所有字符(按enter结束): ");
    while(flag)
    {
        c = getchar();
        if((c != '$')&&(c != '\n'))
        {
            s = (LNode*)malloc(sizeof(LNode));
            s->data = c;
            s->next = L->next;
            L->next = s;
        }
        else if(c == '\n')
        {
            flag = 0;
        }
    }
    return L;
}

//下列函数用于释放单向链表的内存
void FreeList( LNode* head) 
{
    LNode* temp;
    while (head != NULL)
    {
        temp = head;
        head = head->next;
        free(temp);
    }
}

// 打印链表
void printList( LNode* head) 
{
    LNode* temp = head;
    while (temp != NULL) 
    {
        printf("%c -> ", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}

参考资料(视频课程):

数据结构与算法设计 - 西安科技大学 - 学堂在线

你可能感兴趣的:(c语言,链表,数据结构)