c语言实现链表

本文通过实战演示了单链表的基本操作,包括初始化、头插法、尾插法创建链表、插入和删除节点等,并提供了完整的C语言实现代码。

    最近复习到链表,感觉什么都忘了,指针、二级指针,于是今天下午,按照自己想法就手写了一个带头结点的链表,回忆回忆。里面用到了二级指针,实现了链表初的始化,头插法、尾插法创建链表,在链表的第i个位置插入x的元素,单链表的删除,在链表中删除值为x的元素,遍历链表。

    贴码如下:

 

#include<stdio.h>
#include<stdlib.h>

typedef struct Node{

    int data;
    struct Node* next;

}Node,*Linkedlist;

//链表初始化
//头插法
//尾插法
//单链表的插入,在链表的第i个位置插入x的元素
//单链表的删除,在链表中删除值为x的元素
//遍历链表


//链表初始化
void initList(Linkedlist* pHead){
    Node* p;
    p = (Node*)malloc(sizeof(Node));
    if(p==NULL){
        printf("申请内存空间失败!");
    }
    else{
        p->next=NULL;
        printf("创建头结点成功!\n");
        *pHead=p;
    }
}



//头插法创建链表
void NodeHeadCreate(Linkedlist p){
    if(p==NULL){
         printf("链表未初始化!");
    }
    int t;
    Node* q;

    printf("头插法创建链表:");
    while(1){
         scanf("%d",&t);
         if(t==-1){
            break;
         }
         q = (Node*)malloc(sizeof(Node));
         q->next = p->next;
         q->data = t;
         p->next = q;
    }
}


//尾插法创建链表
void NodeRearCreate(Linkedlist p){
    if(p==NULL){
        printf("链表未被初始化!");
    }

    int t,d;

    Node* rear;
    Node* q;
    printf("尾插法创建链表:");
    while(1){
        scanf("%d",&t);
        if(t==-1){
            break;
        }
        q = (Node*)malloc(sizeof(Node));
        q->data = t;
        q->next = NULL;
        rear->next = q;
        rear = q;
    }
}



//单链表的插入,在链表的第i个位置插入x的元素
void LinkedlistInsertNode(Linkedlist pHead,int i,int x){

    int k=0;
    Node* p;
    Node* q;
    p=pHead;

    while(p->next!=NULL){
        k++;
        if(k==i){
            q = (Node*)malloc(sizeof(Node));
            q->next=p->next;
            q->data=x;
            p->next=q;
            break;
        }

        p=p->next;
    }
}



//单链表的删除,在链表中删除值为x的元素
void DeleteLinkedValue(Linkedlist p,int x){
    Node* q;
    q = p;
    int k = 0;
    bool flag = false;
    while(p->next!=NULL){
        if(p->next->data==x){
            q = p->next;
            p->next=q->next;
            free(q);
            flag = true;
            k++;
        }
        if(p->next!=NULL){//注意空指针异常,也可以放在前面
            p = p->next;
        }

    }
    if(flag){
        printf("成功删除节点:%d,并且存在:%d个\n",x,k);
    }
    else
    {
        printf("链表中不存在节点:%d\n",x);
    }
}



//打印链表
void PrintLinklist(Linkedlist p){
    if(p->next!=NULL){
        printf("打印链表的值:");
    }
    while(p->next!=NULL){
        p=p->next;
        printf("%4d",p->data);
    }
    printf("\n");

}

int main(){
    Linkedlist list;
    Node* pHead;
    initList(&pHead);
   // NodeHeadCreate(pHead);
    NodeRearCreate(pHead);
    if(pHead->next==NULL){
        printf("请按头插法或尾插法创建链表失败!");
    }
    PrintLinklist(pHead);

    //请输入要删除的i值
    int i;
    printf("请输入要删除的i值:");
    scanf("%d",&i);
    DeleteLinkedValue(pHead,i);

    printf("删除后的链表值为:");
    PrintLinklist(pHead);

    int j,k;
    printf("请输入要在第i个位置插入的值x:");
    scanf("%d%d",&j,&k);
    LinkedlistInsertNode(pHead,j,k);
    printf("插入k值后的链表值为:");
    PrintLinklist(pHead);


    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值