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

链表的创建
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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值