数据结构-3单向链表程序

链表

Linklist.c

#include <stdio.h>
typedef struct node{
    struct node *next;
        // Plist next;  //err,程序顺序执行,此时编译器还不认识Plist
        //List *next;  //err,理由同上
}List,*Plist;

Plist create_list()     //创建链表头
{
    Plist p=malloc(sizeof(List));    //创建头节点
    p->next=NULL;                    //避免野指针的出现
    return p;
}
int insert_head(Plist P)    //链表插入(头插法)
{
    Plist q=malloc(sizeof(List));    //新建一个要插入的节点
    q->next=p->next;           //17、18行不能交换顺序,否则会造成内存泄漏 
    p->next=q;
    return 0;
}
//尾插法
int insert_tail(Plist p)
{
    if(NULL==p)            //判断指针是否有指向
        return -1;        
  
    while(p->next!=NULL)  //找出尾指针,相当于在遍历链表,但最后指针指向尾指针而不是NULL
    {
        p=p->next;   
    }    //while(p->next=p->next->next)//可阅读性不好    
                    //类似于while(i=i+1)即while(i++)
   
    Plist q=malloc(sizeof(List));    //开辟一个新的节点用于插入尾部
    if(NULL==q)                      //新节点是否开辟成功
    {    
        perror("malloc");
        return -1;    
    }
    q->next=p->next;        //新的节点指向p->next(NULL) //q->next=NULL
    p->next=q;              //原来尾节点的next指向新节点  
    return 0;
}

int delete_pos(Plist p,int pos)
{
    if(NULL==p)        //应该通过链表的节点数判断pos是否合理,暂时不考虑
    {
        puts("arg err");
        return -1;    
    }
    while(--pos)    // --pos !!!!不是pos--因为删除一个节点,p应该在其上一个节点
    {    
        p=p->next;    
    }
    Plist q=p->next;    //定义一个指针记录要删除的节点
    p-next=q->next;     //p->next=p->next->next
    free(q);            //释放删除节点的空间
    return 0;
}



int main()
{
    Plist p=crete_list();//创建链表头,一般链表头不存数据
    insert_head(p);
    insert_head(p);
    insert_head(p);
    insert_head(p);
    
    deleted_pos(p,2);
    return 0}

17、18行:
在这里插入图片描述

while(p):遍历链表
while(p->next)
{p=p->next;}  : 找尾插的地址   //    while(p->next==p->next->next)类似于:while(i=i+1)

链表(存数据版)

Linklist.h

#ifndef _LINKLIST_H_
#define _LINKLIST_H_
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;            //数据区
    struct node *next;   //地址区
}List, *Plist;

Plist create_list();    //创建头节点
int insert_head(Plist p, int data);    //头插
int insert_tail(Plist p, int data);    //尾插
int delete_data(Plist p, int data);    //删除
int change_data(Plist p, int src_data, int dst_data);    //将p链表中所有的src_data改为dst_data
Plist select_data(Plist p, int data);    //根据值查找链表中第一个出现的节点的地址
int empty_list(Plist p);    //判断链表是否为空
void show(Plist p);    //show出链表中所有元素

Linklist.c

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

    /*
typedef struct node{
    int data;        //存储的数据
    struct node *next;
}List, *Plist;*/
Plist create_list()    //创建链表头
{
    Plist p = malloc(sizeof(List));
    if(NULL == p){
        perror("create malloc");
        return NULL;
    }
    p->next = NULL;    //防止野指针

    return p;
}

int insert_tail(Plist p, int data)    //尾插
{
    if(NULL == p){
        puts("head insert arg err");
        return -1;
    }

    while(p->next)
        p = p->next;
    Plist q = malloc(sizeof(List));
    if(NULL == q){
        perror("insert malloc err");
        return -1;
    }
    q->data = data;  //数据赋值
    q->next = p->next;  //q->next = NULL;
    p->next = q;
    return 0;
}
int delete_data(Plist p, int data)
{

}

int change_data(Plist p, int src_data, int dst_data)
{
    if(NULL == p)
    {
        puts("change arg err");
        return -1;
    }
    while(p->next)
    { 
        if(p->next->data == src_data)    //判断是否是一个要修改的节点
        {
            p->next->data = dst_data;
        }       
        p = p->next;     //指针向后移动一位
    }
    return 0;
}

Plist select_data(Plist p, int data)
{

}
int empty_list(Plist p)    //判断链表是否为空
{
    if(NULL == p){
        puts("empty arg err");
        return -1;
    }
    if(NULL == p->next)
        return 1;
    else
        return 0;

}
void show(Plist p)    //show出链表中所有元素
{
    if(NULL == p || empty_list(p)){
        return ;
    }
    p = p->next;    //忽略掉头节点未赋值的数据0
    while(p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    puts("");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值