linux学习总结(数据结构)

学习总结:

linux内核用到很多数据结构的知识,虽然linux是C语言编写,但是里面众多内容是面向对象的思想。所以数据结构的知识很基础,很重要。

数据结构指的是数据的逻辑结构和存储结构及其操作:

  • 数据的逻辑结构

    线性结构      :1.线性表 2.栈 3.队列

    非线性结构   :1.顺序存储 2.图形结构

  • 数据的存储结构

    顺序存储

    链式存储

  • 数据的运算:检索、排序、插入、删除、修改等

先自己写个线性表的操作。以后留着自己看看。

顺序存储结构:(其实函数的返回值一定要判断,那么就比较完美啦,linux内核中的函数一般都有返回值,一般的话错误返回-1,正确的如果只是判断的话

返回0,所以我觉得自己定义的函数也要按照这个规矩来。如果判断语句,循环语句后面只有一句的话,最好不能要{},linux内核会报警。)

#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef int datatype;
typedef struct {
    datatype data[N];
    int last;
}sqlist;
sqlist * create_sqlist()
{
    sqlist *L;
    if((L = (sqlist *)malloc(sizeof(sqlist)))<0)
    {
        printf("malloc error!");
        return NULL;
    }
    L->last = -1;
    return L;
}
int insert(sqlist * L,datatype data,int i)
{
    int j;
    if((L->last >= N-1)||(i < 0)||(i > L->last+1))
        return -1;
    for(j = L->last+1;j>i;j--)
    {
        L->data[j-1] = L->data[j];
    }
    L->last++;
    L->data[i] = data;
    return 0;
}
int isempty(sqlist *L)
{
    return (L->last == -1) ;
}
int delete(sqlist *L,int i)
{
    int j;
    if((L->last == -1)||(i < 0)||(i > L->last))
        return -1;
    for(j = i; j<= L->last; j++)
    {
        L->data[j] = L->data[j+1];
    }
    L->last--;
    L->data[j+1] = 0;
    return 0;
}
int show(sqlist * L)
{
    int i;
    if(L->last ==-1)
    {
        printf("empty!\n");
        return -1;
    }
    for(i = 0;i <= L->last;i++)
    {
        printf("data[%d] = %d\n",i,L->data[i]);
    }
    return 0;
}
int main(int argc,char * argv[])
{
    int i;
    int ret;
    sqlist * L;
    L = create_sqlist();
    for(i = 0;i<10;i++)
    {
        ret = insert(L,i,i);
        if(ret == -1)
        {
            printf("insert error\n");
            return -1;
        }
    }
    ret = show(L);
    if(ret == -1)
    printf("show error\n");
    printf("****************\n");
    ret = delete(L,4);
    if(ret == -1)
        printf("delete error\n");
    ret = show(L);
    if(ret == -1)
        printf("show error\n");

    return 0;
}

链式存储结构:

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#define N 10
typedef int datatype;
typedef struct node {

 datatype data;
 struct node * next;
}linknode ,*linklist;

linklist create()
{
 linklist H;
 if((H = (linklist)malloc(sizeof(linknode)))==NULL)
 {
  perror("malloc");
  exit(-1);
 }
 H->next = NULL;
 printf("create\n");
 return H;
}
int lenth(linklist H)
{
 int i = 0;
 while((H->next)!=NULL)
 {
  H = H->next;
  i++;
 }
 return i;
}
int insert(linklist H,datatype data , int pos)
{
 int i;
 linklist q;
 linklist p = NULL;
 p = H;
 if((pos<0)||(pos>lenth(H)))
 {
  printf("insert error\n");
  return -1;
 }
 if((q = (linklist)malloc(sizeof(linknode))) == NULL )
 {
  perror("malloc");
  exit(-1);
 }
 for(i = 0; i< pos; i++)
 {
  p=p->next;
 }
 q->data = data;
 q->next = p->next;
 p->next = q;
 return 0;
}
int delete(linklist H,int pos)

 int i;
 linklist p;
 p = H;
 if((pos<0)||(pos>lenth(H)))
 {
  printf("delete error\n");
  exit(-1);
 }
 for(i = 0;i < pos;i++)
  H = H->next;
  p = H->next;
  H->next = p ->next;
  free(p);
  
 return 0;
}
int relist(linklist H)
{
 linklist p,q;
 p = H->next;
 H ->next = NULL;
 while(p != NULL)
 {
  q = p;
  p = p->next;
  q ->next = H->next;
  H->next = q;
 }
  

 return 0;
}
int show(linklist H)
{
 linklist p;
 p = H;
 while((p->next)!=NULL)
 {
  printf("data =%d\n",p->data);
  p=p->next;
 }
 return 0;
}
int main(int argc,char * argv[])
{
 int i = 0;
 int ret;
 linklist H;
 H = create();
 for(i = 0;i < 10;i++)
 {
 ret = insert(H,i,i);
 if(ret ==-1)
  printf("insert error\n");
 }
 printf("**********create linklist*************\n");
 ret = show(H);
 if(ret == -1)
  printf("show error\n");
 printf("**********delete 3          *********\n");
 ret = delete(H,3);
 if(ret == -1)
  printf("delete error\n");
 ret = show(H);
 printf("*********reservelist         ********\n");
 ret = relist(H);
 if(ret == -1)
  printf("reservelist error\n");
 show(H);
 return 0;
}

顺序存储与链式存储的区别:
1.顺序存储在逻辑上相邻的元素其存储位置也是相邻的;

2.顺序存储对数据元素的存取为随机存取,或按地址存取;

3.存储密度高

4.对表的插入和删除元素时间复杂度较差。

5.插入等操作运算耗时,元素的移动要成片移动。

 

 

转载于:https://www.cnblogs.com/liugf05/archive/2012/06/12/2546763.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值