LinuxC应用开发学习笔记(四)--数据结构

2021/12/9 7:17:12

本文主要是介绍LinuxC应用开发学习笔记(四)--数据结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

数据结构

1、线性表

线性表的头文件

#ifndef SQLIST_H__
#define SQLIST_H__

#define DATASIZE  1024 
typedef int datatype;

typedef struct node_st
{
    datatype data[DATASIZE];
    int last;
    /* data */
}sqlist;
sqlist *sqlist_create();

void sqlist_creat1(sqlist **);

int sqlist_insert(sqlist *,int i,datatype *);

int sqlist_delete(sqlist *,int i);

int sqlist_find(sqlist *,datatype *);

int sqlist_isempty(sqlist *);

int sqlist_setempty(sqlist *);

int sqlist_getnum(sqlist *);

void sqlist_display(sqlist *);

int sqlist_destory(sqlist *);

int sqlist_union(sqlist *,sqlist *);

#endif // !SQLIST_H__

线性表的C文件

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

#define DATASIZE  1024 
typedef int datatype;


sqlist *sqlist_create()
{
    sqlist *me;
    me = malloc(sizeof(*me));
    if (me == NULL)
    {
        return NULL;
    }
    me->last = -1;
    return me;

}

void sqlist_creat1(sqlist **ptr)
{
    *ptr = malloc(sizeof(**ptr));
    if (*ptr == NULL)
    {
        return ;
    }
    (*ptr)->last =-1;
    return ;
    
}

int sqlist_insert(sqlist *me,int i,datatype *data){

    int j;
    if (me->last == DATASIZE-1)
    {
        return -1;
    }
    if (i<0 || i>me->last+1)
    {
        return -2;
    }

    for (j = me->last; i <= j; j--)
    {
        me->data[j+1] = me->data[j];
    }
    me->data[i] = *data;
    me->last++;
    return 0;
    
    
}

int sqlist_delete(sqlist *me,int i)
{
    int j;
    if (i< 0 || i> me->last)
        return -1;

    for ( j = i+1; j <= me->last;j++)
        me->data[j-1] = me->data[j];
    me->last--;
    return 0; 
}

int sqlist_find(sqlist *me,datatype *data)
{
    int i;
    
    if (sqlist_isempty(me) == 0)
      return -1;

    for (i = 0; i < me->last; i++)
        if (me->data[i] == *data)
            return i;
    return -2;

}

int sqlist_isempty(sqlist *me)
{
    if (me->last == -1)
    {
        return 0;
    }
    return -1;

    
    
}

int sqlist_setempty(sqlist *me)
{
    me->last = -1;
    return 0;
    
}

int sqlist_getnum(sqlist *me)
{
   return (me->last + 1);
}

void sqlist_display(sqlist *me)
{
    int i;
    if (me->last == -1)
    return;
    for ( i = 0; i <= me->last; i++)
    {
        printf("%d ",me->data[i]);
    }
    printf("\n");
    return;
}


int sqlist_destory(sqlist *me)
{
    free(me);
    return 0;  
}

int sqlist_union(sqlist *list1,sqlist *list2)
{
        // list 1-> 12 23 34 45 56
        // list 2-> 78 89 56 23 10
        int i;
        for(i=0;i <= list2->last;i++)
        {
            if (sqlist_find(list1,&list2->data[i])<0)
            {
                sqlist_insert(list1,0,&list2->data[i]);
            }
        }        
}

线性表的main.c文件

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

int main()
{
    sqlist *list = NULL;
    sqlist *list1 = NULL;
    datatype arr[] = {12,23,34,45,56};
    datatype arr1[] = {89,98,67,47,53};
    int i;
    int err;
    list = sqlist_create();
//    sqlist_creat1(&list);
    if(list == NULL)
    {
        fprintf(stderr,"sqlist_creat() failed!\n");
        exit(1);
    }

    list1 = sqlist_create();
    if (list1 == NULL)
    {
        fprintf(stderr,"sqlist1_creat() failed!\n");
        exit(1);
    }
    

 //   printf("%d %d\n",__LINE__,sizeof(arr)/sizeof(*arr));
    for ( i = 0; i < sizeof(arr)/sizeof(*arr); i++)
    {
         if((err = sqlist_insert(list,0,&arr[i]))!=0)
         {  
            if(err == -1)
                fprintf(stderr,"The arr is full.\n");
            else if (err == -2)
                fprintf(stderr,"The position you wan to insert is wrong.\n");
            
            else 
                fprintf(stderr,"error!");
            exit(1);
         }
    }
    
    sqlist_display(list);
    for (int  i = 0; i < sizeof(arr1)/sizeof(*arr1); i++)
    {
        sqlist_insert(list1,0,&arr1[i]);
    }
    sqlist_display(list);

    
    sqlist_delete(list,1);
//  printf("%d\n",ret);
    sqlist_display(list);
#if 0
    sqlist_union(list,list1);

    sqlist_display(list);

    sqlist_destory(list1);
#endif
    exit(0);
}

有头结点的单向链表

单向链表的.h文件

#ifndef LIST_H__
#define LIST_H__
typedef int datatype;
typedef struct node_st
{
    datatype data;
    struct node_st *next;
}list;

list* list_creat();

int list_insert_at(list *,int i,datatype *); 
int list_order_insert(list *,datatype *);
int list_delete_at(list*,int i,datatype *);
int list_delete(list *,datatype *);
int list_isempty(list *);
void list_display(list*);
void list_destory(list *);
#endif // !LIST_H__#define  "" 

单向链表的.c文件

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

list* list_creat()
{
    //一个带头节点的单链表
    list *me;
    me =  malloc(sizeof(*me));
    if (me == NULL)
        return NULL;
    me->next = NULL;
    return me;
}

int list_insert_at(list *me,int i,datatype *data)
{
    int j = 0;
    list *node = me,*newnode;
    if (i<0)return -1;
    
    while (j<i&& node != NULL)
    {
        node = node->next;
        j++;
    }
    if (node)
    {
        newnode = malloc(sizeof(*newnode));
        if (newnode == NULL)
            return -2;
        newnode->data = *data;
        newnode->next == NULL;
        newnode->next = node->next;
        node->next = newnode;

        return 0;
        
    }
    else
        return -3;
    

} 
void list_display(list*me)
{
    list *node = me->next;
    if(list_isempty(me) == 0)
    {
        return;
    }
    while (node!=NULL)
    {
        printf("%d ",node->data);
        node = node->next;
    }
    printf("\n");
    return ;
}
int list_order_insert(list *me,datatype *data)
{
    list *p = me,*q;
    while (p->next && p->next->data<*data)
        p = p->next;
        q = malloc(sizeof(*q));
        if (q == NULL)
            return -1;
        q->data = *data;
        q->next = p->next;
        p->next = q;
        return 0;
}
int list_delete_at(list*me,int i,datatype *data)
{
   int j = 0;
   list *p = me,*q;

    *data = -1;

   if (i<0)
   {
       return -1;
   }
   
   while (j<i&&p)
   {
       p = p->next;
       j++;
   }
   if (p)
   {
       q = p->next;
       p->next = q->next;
       *data = q->data;
       free(q);
       q = NULL;
       return 0;
   }
   else
   {
       return -2;
   }
   
   
   
    
    

}
int list_delete(list *me,datatype *data)
{
    list *p = me,*q;
    while (p->next && p->next->data != *data)
    {
        p=p->next;
    }
    if (p->next == NULL )
        return -1;
    else
    {
        q = p->next;
        p->next = q->next;
        free(q);
        q = NULL;
    }

}
int list_isempty(list *me)
{
    if (me->next == NULL)    
        return 0;
    return 1;
    
}
void list_destory(list *me)
{
    list *node,*next;
    for(node = me->next;node!=NULL;node = next)
    {
        next = node->next;
        free(node);
    }
    free(me);
    return;
} 

单向链表表的main.c文件

#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"
int main()
{
    list *l;
    int i,err;
    datatype arr[] = {12,9,23,2,34,6,45};
    l = list_creat();
    if (l == NULL)
    {
        exit(1);
    }

    for (i = 0; i < sizeof(arr)/sizeof(*arr); i++)
    {

       if(list_order_insert(l,&arr[i]))
       //if(list_insert_at(l,0,&arr[i]))
           exit(1);
    }

    list_display(l);
    datatype value;

    err = list_delete_at(l,2,&value);
    if (err)
    {
        exit(1);
    }
    list_display(l);
    printf("delete:%d\n",value);
    
#if 0
    int value = 12;
    list_delete(l,&value);
    list_display(l);
#endif
    list_destory(l);
    



    exit(0);

}

无头结点的单向链表

无头结点的单向链表.h文件

#ifndef NOHEAD_H__
#define NOHEAD_H__ 
#define NAMESIZE 32

struct score_st
{
    int id;
    char name[NAMESIZE];
    int math;
    int chinese;
};

struct  node_st
{
    struct score_st data;
    struct node_st *next;
};

int list_insert(struct node_st **,struct score_st *);

void list_show(struct node_st *);


int list_delete(struct node_st **);

struct score_st * list_find(struct node_st*,int id);

void list_destory(struct node_st* );

#endif // !1

无头结点的单向链表.c文件

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

int list_insert(struct node_st **list,struct score_st *data)
{
    struct node_st *new;
    new = malloc(sizeof(*new));

    if (new == NULL)
    {
        return -1;
    }
    new->data = *data;
    new->next = *list;
    *list = new;
    
    return 0;
}

void list_show(struct node_st *list)
{
    struct node_st *cur;
    for (cur = list;cur != NULL;cur=cur->next)
    {
        printf("%d %s %d %d \n",cur->data.id,cur->data.name,cur->data.math,cur->data.chinese);
    }
    
}


int list_delete(struct node_st **list)
{
    struct  node_st *cur;
    if (*list == NULL)
    {
        return -1;
    }
    cur = *list;
    *list = (*list)->next;   
    free(cur);
    return 0;
}

struct score_st *list_find(struct node_st*list,int id)
{
    struct node_st *cur;
    for (cur  = list; cur != NULL;cur = cur->next)
    {
        if(cur->data.id == id)
            {
                return &cur->data;
            }
        

    }
    return NULL;
}

void list_destory(struct node_st* list)
{
    struct node_st *cur;
    if (list == NULL)
    {
       return;
    }
    for (cur = list;cur!= NULL;cur = list)
    {
        list = cur->next;
        free(cur);
    }
    

}

无头结点的main.c文件

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

int main()
{
    struct node_st *list = NULL;
    struct score_st tmp;
    int i,ret;
    for ( i = 0; i < 7; i++)
    {
        tmp.id = i;
        snprintf(tmp.name,NAMESIZE,"std %d",i);
        tmp.math = rand()%100;
        tmp.chinese = rand()%100;
  
        ret = list_insert(&list,&tmp);  
        if (ret != 0)
        {
           exit(1);
        }
         
    }

    list_show(list);

    printf("\n\n");
//    list_delete(&list);
//    list_show(list);
    int id = 13;
    struct score_st *ptr;
    ptr = list_find(list,id); 
    if(ptr == NULL)
    {
        printf("can't find\n");
    }
    else
    {
       printf("%d %s %d %d \n",ptr->id,ptr->name,ptr->math,(*ptr).chinese);

    }

    list_destory(list);
    
    exit(0);
}

多项式合并的文件

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

struct node_st
{
    int coef;//系数
    int exp;
    struct node_st *next;
};

struct node_st *ploy_create(int a[][2],int n)
{
    struct node_st *me;
    struct node_st *newnode,*cur;
    int i;
    me = malloc(sizeof(*me));
    if (me == NULL)
    {
        exit(1);
    }

    me->next = NULL;

    cur = me;

    for (i = 0;i<n;i++)
    {
       newnode = malloc(sizeof(*newnode));
        if(newnode == NULL)
        {
            return NULL;
        } 
           newnode->coef = a[i][0];
           newnode->exp  = a[i][1];
           newnode->next = NULL;

           cur->next = newnode;
           cur = newnode;
       
    }
    

    return me;
    

}


void poly_show(struct node_st *me)
{
    struct node_st *cur;
    for (cur = me->next;cur!=NULL;cur = cur->next)
    {
        printf("(%d %d) ",cur->coef,cur->exp);
    }
    printf("\n");

}

void poly_union(struct node_st *p1,struct node_st *p2)
{
    struct node_st *p,*q,*r;
    p = p1->next;
    q = p2->next;
    r = p1;

    while (p && q)
    {
        if (p->exp<q->exp)
        {
           r->next = p;
           r = p;
           p = p->next; 
        }
        else if (p->exp>q->exp)
        {
            r->next = q;
            r = q;
            q = q->next;
        }
        else
        {
              p->coef += q->coef;
              if (p->coef)
              {
                  r->next = p;
                  r = p;
              }
              p = p->next;
              q = q->next;     
        }  
    }
    if (p == NULL)
        r->next = q;
    else 
        r->next = p;

}
int main()
{
  int a[][2] = {{5,0},{2,1},{8,8},{3,16}};
  int b[][2] = {{6,1},{16,6},{-8,8}};
  
  struct node_st *p1,*p2;

    p1 = ploy_create(a,4);
        if (p1 == NULL)
        {
           exit(1);
        }
    p2 = ploy_create(b,3);
        if (p2 == NULL)
        {
            exit(1);
        }
  poly_show(p1);

  poly_show(p2);

  poly_union(p1,p2);

  poly_show(p1);
    

}

约瑟夫环问题

约瑟夫环的单向环链文件

//单项环链
#include <stdio.h>
#include <stdlib.h>
#define  JOSE_NR 8
struct node_st
{
    int data;
    struct node_st *next;
};

struct node_st *jose_create(int n)
{
    struct node_st *me;
    int i = 1;
    struct node_st *newnode,*cur;

    me = malloc(sizeof(*me));
    if (me == NULL)
        return NULL;
    me->data = i;
    me->next = me;
    i++;

    cur = me;
    for (;i<=n;i++)
    {
       newnode =  malloc(sizeof(*newnode));
       if(newnode == NULL)
            return NULL;
       newnode->data = i;
       newnode->next = me;

       cur->next = newnode;
       cur = newnode;
    } 
    return me;
}

void jose_show(struct node_st *me)
{
    struct node_st *list;
    for (list = me;list->next!=me;list = list->next)
    {
        printf("%d ",list->data);
    }
    printf("%d\n",list->data);
    
    
}

void jose_kill( struct node_st **me,int n)
{
    struct node_st *cur = *me,*node;
    int i = 1;
    while(cur != cur->next)
    {
        while (i<n)
        {
        node = cur;
        cur = cur->next;
        i++;
        }

        printf("%d ",cur->data);
        node->next = cur->next;
        free(cur);

        cur = node->next;
        i = 1;
    }

    *me = cur;
    printf("\n");
}


int main()
{
    struct node_st *list;
    int n = 3;
    list = jose_create(JOSE_NR);
    if (list == NULL)
    {
        exit(1);
    }
    
    jose_show(list);

    jose_kill(&list,3);

    jose_show(list);

    exit(0);
}


这篇关于LinuxC应用开发学习笔记(四)--数据结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程