学习总结:
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.插入等操作运算耗时,元素的移动要成片移动。