zoukankan      html  css  js  c++  java
  • 链表的增删改查的操作

         看来几篇博客,自己还没有实践

    #include <stdio.h>
    #include <malloc.h>
    #define LEN sizeof(struct student)
    
    /*----------------数据定义----------------------*/ 
    
    //定义一个学生信息的结构体,包括学号,姓名和结构体类型的指针 
    struct student
    {
        long num;                //学号 
        char name[128];            //姓名 
        struct student *next;    //结构体指针 
    };
    
    typedef struct student * stuNode;
    
    int n=0;                    //全局变量,记录链表的长度 
     
    /*---------------函数声明---------------------*/
     
    stuNode Create();            //创建一个新的链表                     
    
    void Print(stuNode head);    //通过传入的链表头指针打印整个链表 
    
    stuNode Delete(stuNode head,int num);    //通过传入的链表头指针和学生学号删除节点 
    
    stuNode Insert(stuNode head,stuNode newStu);    //依照学生学号的顺序向链表中插入新元素 
    
    
    /*---------------函数定义----------------------*/
    
    struct student *Create()
    {
        struct student *head,*p1,*p2;
        
        //开辟一个LEN大小的空间,并让p1,p2指针指向它 
        p2=p1=(struct student *)malloc(LEN);
        //将头指针置为NULL 
        head=NULL;
        
        //创建链表节点并给节点的元素赋值 
        printf("请输入学生的学号和姓名:");
        scanf("%ld %s",&p1->num,p1->name);
        while(p1->num!=0)
        {
            n=n+1;
            if(NULL==head)
            {
                head=p1;
            }
            else
            {
                p2->next=p1;
            }
            p2=p1;
            p1=(struct student *)malloc(LEN);
            printf("请输入学生的学号和姓名:");
            scanf("%ld %s",&p1->num,p1->name);
        }
        //将尾节点的指针置为NULL 
        p2->next=NULL;
        return head;
    }
    
    
    void Print(struct student *head)
    {
        struct student * p;
        p=head;
        
        //判断链表是否为空 
        if(NULL==head)
        {
            printf("链表为空!
    ");
            return head;
        }
        else
        {
            //循环打印链表中的元素 
            printf("%d 个记录分别为:
    ",n);
            while(p!=NULL)
            {
                printf("%ld %s
    ",p->num,p->name);
                //指针指向下一个节点 
                p=p->next;
            }
        }
    }
    
    
    struct student *Delete(struct student * head,int num)
    {
        struct student *p1;
        struct student *p2;
        p1=head;
        //判断链表是否为空 
        if(NULL==head)
        {
            printf("链表为空!
    ");
            return head;
        }
        //遍历节点,判断当前节点是不是需要删除的节点及是否为尾节点
        //如果找到相应节点,或者已经遍历到尾节点就跳出循环 
        while(p1->num!=num&&p1->next!=NULL)
        {
            p2=p1;
            p1=p1->next;
        }
        //判断是否找到相应节点 
        if(p1->num==num)
        {
            //要删除的节点是不是链表的第一个节点
            //如果是,就将头指针指向该节点的后一个节点
            //如果不是,就将该节点的前一个节点的指针指向该节点的后一个节点 
            if(head==p1)
            {
                head=p1->next;
            }
            else
            {
                p2->next=p1->next;
            }
            n=n-1;
            printf("%ld 节点已删除.
    ",num);
        }
        else
        {
            printf("链表中没有要删除的元素.
    ");
        }
        return head;
    }
    
    
    struct student *Insert(struct student * head,struct student * newStu)
    {
        struct student *p0;
        struct student *p1;
        struct student *p2;
        p0=newStu;
        p1=head;
        //判断链表是否为空,如果是空链表,就将新节点作为第一个节点 
        if(NULL==head)
        {
            head=p0;
            p0->next=NULL;
        }
        else
        {
            //遍历每一个节点中的学号,与新学号比较大小
            //如果找到一个学号比新学号大,就将新学号的节点插入它之前 
            //如果尾节点的学号仍比新学号小,就将新节点插入到链表尾部 
            while((p0->num > p1->num)&&(p1->next!=NULL))
            {
                p2=p1;
                p1=p1->next;
            }
            //找到一个比新学号大的节点 
            if(p0->num <= p1->num)
            {
                //判断该节点是否为头节点,如果是,则将新节点设置为头节点 
                if(p1==head)
                {
                    head=p0;
                }
                else
                {
                    p2->next=p0;
                }
                  p0->next=p1;
            }
            else
            {
                p1->next=p0;
                p0->next=NULL;
            }
        }
        //链表长度加1 
        n=n+1;
        printf("%ld 插入成功!
    ",newStu->num);
        return head;
    }
    
    void main()
    {
        struct student *head;
        struct student *stu;
        int num;
        head=Create();
        Print(head);
        printf("请输入要删除的学号:");
        scanf("%ld",&num);
        while(num!=0)
        {
            head=Delete(head,num);
            Print(head);
            printf("请输入要删除的学号:");
            scanf("%ld",&num);
        }
        printf("请输入要插入的节点:");
        stu=(struct student *)malloc(LEN);
        scanf("%ld %s",&stu->num,stu->name);
        while(stu->num!=0)
        {
            head=Insert(head,stu);
            printf("请输入要插入的节点:");
            stu=(struct student *)malloc(LEN);
            scanf("%ld %s",&stu->num,stu->name);
        }
        Print(head);
    }

     参考:

    #include<stdio.h>
    #include<stdlib.h>
    #define LEN sizeof(struct student)
    struct student{
        int num;
        double score;
        struct student *next;
    };
     
    //创建一个链表
    struct student * create(void){
        struct student *p1,*p2,*head;
        int n = 0;
        p1 = p2 = (struct student *)malloc(LEN);
        scanf("%d%lf",&(p1->num),&(p1->score));
        while(p1->num!=0){
            n++;
            if(n==1){
                head = p1;
            }else{
                p2 = p1;
            }
            p1 = (struct student *)malloc(LEN);
            scanf("%d%lf",&(p1->num),&(p1->score));
            p2->next = p1;
        }
         
        p2->next = NULL;
        return head;
    }
    struct student *delw(struct student *start,int num){
        struct student *p1,*p2;
        //链表为空
        if(start==NULL){
            printf("
    list null!
    ");
            return NULL;
        }
        p1 = start;
        p2 = NULL;
        //链表不为空
        //链表只有一个元素,且即为所要找的元素
        /*if(p1->next==NULL&&p1->num == num){
            printf("there is only one element and that is it!");
            return NULL;
        }*/
        while(p1->next!=NULL&&p1->num!=num){
            p2 = p1;
            p1 = p1->next;
        }
         
        if(num == p1->num){
            if(p1 == start){
                return start->next;
            }else{
                p2->next = p1->next;
            }
        }else{
            printf("number not found!");
        }
         
        return start;
    }
     
    struct student *del(struct student *head,long num){
     
        struct student *p1, *p2;
        //链表为空
        if(head == NULL){
            printf("
    list null!
    ");
            return head;
        }
        //链表不为空
        p1 = head;
        while(p1->next!=NULL&&num!=p1->num){
            p2 = p1;
            p1 = p1->next;
        }
        if(num == p1->num){
            if(p1 == head){
                head = p1->next;
            }else{
                p2->next = p1->next;
                printf("delete:%ld
    ",num);
            }
        }else
                printf("%ld not been found!
    ",num);
        return head;
     
    }
    //删除一个节点
    struct student * deleteNode(struct student *start,int num){
        struct student *p1, *p2,*before,*after;
        //空表
        if(start==NULL){
            printf("the linktable is null");
            return NULL;
        }
        p1 = p2 = start;
        //只有一个节点
        if(start->next==NULL){
            if(start->num==num){
                return NULL;
            }
        }
        //链表不为空(两个以上的节点)
        //1:链表的第一个即为所要找的
        if((start->num == num)&&(start->next!=NULL)){
            return start->next;
        }
        while(p1!=NULL){
            if(p1->num==num){
                before = p2;
                after = p1->next;
            }
            p2 = p1;
            p1 = p1->next;
        }
        before->next = after;
        return start;
    }
     
    struct student * insert(struct student *head,struct student *stu){
        struct student *p1,*p2, *p0;
        p1 = head;
        p0 = stu;
         
        //链表为空
        if(head == NULL){
            head = p0;
            p0->next = NULL;
            printf("the link is null
    ");
            return NULL;
            //链表不为空,比较num,(如22, 33, 55),44应插入至33后面
        }else{
            //一个元素
            //printf("head.next is not null");
            //两个以上元素: 22 55 88
            while(p1->num<p0->num&&p1->next!=NULL){
                p2 = p1;
                p1 = p1->next;
            }
     
            if(p1->num>p0->num){//
                if(p1==head){//p0排到最前
                    head = p0;
                    p0->next = p1;
                }else{
                    //p0排到中间
                    p2->next = p0;
                    p0->next = p1;
                }
            }else{//p0排到最后
                p1->next = p0;
                p0->next = NULL;
            }
     
            return head;
        }
         
     
    }
     
    void printLink(struct student *p){
        struct student *p_afterDeal = p;
        p_afterDeal = p;
        while(p_afterDeal!=NULL){
            printf("num = %d, score = %lf
    ",p_afterDeal->num,p_afterDeal->score);
            p_afterDeal = p_afterDeal->next;  
        }
    }
    int main(void){
         
        struct student * p_std, * p_afterDel,*p,*p_afterInsert; 
        struct student newstd = {44,44.4,NULL};
        //创建一个链表
        printf("创建一个链表:
    ");
        p_std = create();
        printf("创建的链表如下:
    ");
        printLink(p_std);
        //插入一个节点
        printf("插入一个节点:44
    ");
        p = &newstd;
        p_afterInsert = insert(p_std,p);
        printf("插入一个节点后的列表如下:
    ");
        printLink(p_afterInsert);
        //删除一个节点
        printf("删除一个节点:44
    ");
        p_afterDel = deleteNode(p_afterInsert,44);
        printf("删除一个节点后的列表如下:
    ");
        printLink(p_afterDel);
        system("pause");
    }
    /**
     *C语言实现,用了三个指针操作,没用构造函数
     */
    #include<iostream> 
    using namespace std;
    struct student {
        int data;
        struct student* next;
    };
    int main()
    {
        int data;
        struct student *head,*tail,*temp;
        head = NULL;
        while(cin>>data && data!=-1) {
            temp = (struct student*)malloc(sizeof(struct student));
            temp->data = data;
            temp->next = NULL;
            if(head==NULL) {
            head = temp;
                tail = head;
            } else { 
                tail->next = temp;
                tail = temp;        
            }         
        }
           
        tail = head;
        while(tail!=NULL) {
            cout<<tail->data<<endl;
            tail = tail->next;
        }
        system("pause");
        return 0;
    }
    
    /**
     *C/C++实现,用了三个指针操作,用了构造函数
     */
    #include<iostream> 
    using namespace std;
    struct student {
        int data;
        struct student* next;
        student(int a) {
            this->data = a;
            this->next = NULL; 
        }
    };
    int main()
    {
        int data;
        struct student *head,*tail,*temp;
        head = NULL;
        while(cin>>data && data!=-1) {       
            if(head==NULL) {
                head = new student(data);
                tail = head;
             } else {
                 temp = new student(data);
                 //temp用来接收新节点,这样tail的next不会丢失 
                 tail->next = temp;
                 tail = temp;              
             }         
        }    
           
        tail = head;
        while(tail!=NULL) {
            cout<<tail->data<<endl;
            tail = tail->next;
        }
        system("pause");
        return 0;
    }
    
    /**
     *C/C++实现,用了两个指针操作,用了构造函数
     */
    #include<iostream> 
    using namespace std;
    struct student {
        int data;
        struct student* next;
        student(int a) {
            this->data = a;
            this->next = NULL; 
        }
        student(int a, struct student* p) {
            p->next = this;
            this->data = a;
            this->next = NULL;
        }
    };
    int main()
    {
        int data;
        struct student *head,*tail;
        head = NULL;
        while(cin>>data && data!=-1) {           
            if(head==NULL) {
                head = new student(data);
                tail = head;             
             } else {
                  tail = new student(data, tail);
             }        
        }
           
        tail = head;
        while(tail != NULL) {
            cout<<tail->data<<endl;
            tail = tail->next;
        }
        system("pause");
        return 0;
    }

    参考:http://www.cnblogs.com/yanghuahui/archive/2012/04/15/2451076.html

    http://www.cnblogs.com/ligang305/archive/2012/08/25/2656343.html

    http://www.cnblogs.com/wolfred7464/p/4335298.html

    http://www.cnblogs.com/xnwyd/archive/2010/04/28/1723151.html

  • 相关阅读:
    队列
    栈的链式存储
    单例和多例设计模式
    顺序栈的基本操作
    串的模式匹配
    线性表的链式存储结构
    倒置顺序表
    回文序列
    go语言系列-从运算符到函数
    go语言系列-从零到数据类型
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5428839.html
Copyright © 2011-2022 走看看