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

链表:单向链表的理解,创建及基本操作

程序员文章站 2022-05-12 09:21:26
...
链表的创建
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

相关标签: 单向链表