我是靠谱客的博主 无心心锁,最近开发中收集的这篇文章主要介绍链表:单向链表的理解,创建及基本操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

链表的创建
typedef struct info{
    int data;
    struct info *next;
}node;
int main(){
    node *head=NULL;
}//这是一个空链表,head是它的开头,然而现在什么都没有

  我们得到这样的数据类型:该类型包含数据(data)和指针next两部分,指针指向下一个相同的结构体.
像这样

链表的基本操作

  • 现在我们需要新增这样的结构体并链接它们,为了更方便地对链表进行操作,我们再引入这样一个结构体;
typedef struct ctrl{
    node *head;//指向链表头部
    node *tail;//指向链表尾部   方便后续操作
}List;

void add(List *list,int num){//尾插
    node *p=(node *)malloc(sizeof(node));
    p->next=NULL;
    p->data=num;
    if(list->next){
        list->tail=p;
    }else{
        list->head=list->tail-p;
    }
}
void head_add(List *plist,int num){//头插 
    node *p=(node *)malloc(sizeof(node));
    p->num=num;
    if(plist->head){//链表不为空
        p->next=plist->head;
        plist->head=p;
    }else{//链表为空
        plist->head=p;
        p->next=NULL;
    }
}
int main(){
    int num;
    List list;
    list.head=list.tail=NULL;
    while(scanf("%d",&num)&&num!=-1){//假设-1为输入结束标志
    add(&list,num);
    }
}

  • 查 可以作为遍历的改体
//遍历输出
void print(List *list){
    node *p;
    for(p=list->head;p;p=p->next){
    pritnf("想输出啥输出啥");
    }
}
//基本查找
void search(List *list,int obj){
    node *p;
    for(p=list->head;p;p=p->next){
        if(p->data==num){
            printf("//for example,print num'name if it has")
        }
    }
}
//可参照查
node * change(List *list,int num){
    node *p;
    for(p=list->head;p;p=p->next){
        if(p->data==num){
            return p;
        }
    }
}
//我们返回这样一个指向目标的指针,可以对其任意部分进行修改

其实我们也可以写一个void的函数,传入更多参数,进行数据域中不同数据的修改。

void kill(List *list,int num//按某数据查找目标){
    node *p=list->head,*dead;
    if(p->data==num){//需要删除的是第一个
        list->head=p->next;
        free(p);
    }else{
        for(p;p->next;p=p->next){
            if(p->next->data==num){//找到我们需要删除的
                dead=p->next;
                p->next=dead->next;
                free(dead);//加上break;删除一个即停止
            }
        }
    }
}
第一个节点不放东西的写法

  如果第一个节点不放数据,则插入时无需判断链表是否为空,插入时更为简洁。

void head_add(List *list,int num){
    node *p=(node *)malloc(sizeof(node));
    p->data=num;
    p->next=list->head->next;
    list->head->next=p;
}//头插时tail失去作用

void add(List *list,int num){
    node *p=(node *)malloc(sizeof(node));
    p->data=num;
    p->next=list->tail->next;//p->next=NULL;
    list->tail->next=p;
    list->tail=p;
}

int main(){
    List list;
    int num;
    node *p=(node *)malloc(sizeof(node));//空的头结点
    p->next=NULL;
    list.head=list.tail=p;
    while(scanf("%d",&num)&&num!=-1){
        add(&list,num);
    }
}

注意此时遍历链表时从list->head->next开始

//如有错误或更好的方法,还请指出

2018/4/21

最后

以上就是无心心锁为你收集整理的链表:单向链表的理解,创建及基本操作的全部内容,希望文章能够帮你解决链表:单向链表的理解,创建及基本操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部