链表的基本操作----创建、删除、排序、插入、查找、求长

此博客将详细介绍单链表的创建、删除、排序、插入、查找、求长
用一个简单的单链表作为例子,此链表只存放一个int,链表头结点不存放数据

主函数

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

typedef struct node
{
    int num;             //数据域
    struct node *next;   //指针域
}Node;

int main(int argc, char const *argv[])
{
    Node *Head;
    Head=Set();     //创建链表
    /*  ···  */     //这里是所需的的其他操作
    return 0;
}

创建

输入0时结束


Node *Set(void){  
    Node *Head=(Node *)malloc(sizeof(Node));
    Head->next=NULL;
    Node *pre=NULL,*t=pre,*p;  
    while(1){  
        p=(Node *)malloc(sizeof(Node));  
        p->next=NULL;  
        scanf("%d",&p->num);  
        if(p->num==0){  
            free(p);  
            break;  
        }  
        if(pre==NULL)  
            pre=p;  
        else{  
            t->next=p;  
        }  
        t=p;  
    }  
    Head->next=pre;
    return Head;
} 

删除

删除某个值为nu所有结点

void Del(Node *Head,int nu){  
    Node *t=Head;  
    Node *p=Head->next;  
    while(p){  
        if(p->num==nu){  
            t->next=p->next;
            free(p);
            p=t->next;  //继续向后删 删除所有num=nu的结点
        }  
        else{  
            t=p;  
            p=p->next;  //若不相等,继续向后找
        }  
    }  
}  

求长

int Len(Node *Head){  
    int count=0;  
    Node *t=Head->next;  
    while(t){  
        t=t->next;  
        count++;  
    }  
    return count;  
} 

打印

根据所需打印链表的信息

void Show(Node *Head){  
    Node *t=Head->next;  
    while(t){  
        printf("%d  ",t->num);  
        t=t->next;  
    }  
    printf("\n");  
}

排序

关于排序,本人写过一篇较为详细的冒泡排序博客
单链表的冒泡排序

插入

增添结点,新节点num值为n

尾插

void Add(Node *Head,int n){  
    Node *t=Head->next;  
    Node *p=(Node *)malloc(sizeof(Node));  
    p->num=n;  
    p->next=NULL;  
    while(t->next){   
        t=t->next;  
    }  
    t->next=p;  
} 

头插

void Add2(Node *Head,int n){  
    Node *p=(Node *)malloc(sizeof(Node));  
    p->num=n;  
    p->next=Head->next;  
    Head->next=p; 
} 

查找

在链表中查找num值为n的结点,找到返回此节点,没找到返回NULL

Node *Find(Node *Head,int n){
    Node *t=Head->next;
    while(t){
        if(t->num==n)
            break;
        t=t->next;
    }
    return t;
}

猜你喜欢

转载自blog.csdn.net/CodeFarmer__/article/details/80224661