就这么东打一枪西打一枪的混过了一个月的时间,虽然还只能算作入门,但对数据结构也算小有那么点了解了。线性链表--线性表的链式存储结构,区别对待于顺序存储结构。
线性链表的结点分为两部分:数据域和指针域。数据域,顾名思义存储数据元素信息的域;指针域,用于存储直接后继(前驱)的存储位置
数据结点的示意图
单链表:
//线性表的单链表存储结构
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*Linklist;
单链表存储结构示意图
注意:
由于链表中第一个结点没有直接前驱,所以必须设置一个头指针head存储第一个结点的地址。最后一个结点没有直接后继,其指针域应为空指针,C语言用NULL或0来表示,在图中表示为“∧”。
单链表操作中的malloc和free函数:
原型:(在头文件stdlib.h中声明)
void *malloc(size_t size);(动态内存的分配)
malloc函数申请一块连续的内存,它会向程序返回一个指向这块内存的指针,如果申请失败,就会返回一个NULL指针,因此,每次检查malloc返回的指针是非常必要的。size表示其申请的字节(字符)数。
例子:
实际上其与pi=malloc(32*sizeof(int))完全一样,而且后者的好处也很明显
int *pi;
pi=malloc(128);
...
实际上其与pi=malloc(32*sizeof(int))完全一样,而且后者的好处也很明显
void free(void *pointer);(动态内存的释放)
p=(LinkList)malloc(sizeof(LNode)):系统生成一个Lnode型的结点,同时将该结点的起始位置赋给指针变量p;
Free(q):系统回收一个Lnode型的结点,回收后的空间可以备作再次生成结点时用。
可能会有人在单链表创建上犯点儿迷糊,下面的代码希望能够帮到大家。
n个结点单链表的创建:
1.逆位序:
Void CreateList-L(LinkList L,int n){
//逆位序输入n个元素的值,建立带表头结点的单链线性表L
if(L=(LinkList )malloc(sizeof(Lnode)))==NULL) exit(1);
L–>next=null;//先建立一个带头结点的单链表(头结点的指针域为空)
int i;
for(i=n;i>0;--i) {
if((p=(LinkList )malloc(sizeof(Lnode)))==NULL)
exit(1);
scanf(("%d",&p–>data); //输入元素值
p–>next= L–>next;
L–>next=p;
}//for
}// CreateList-L 算法的时间复杂度:O(listlength(L)
2.正位序:
Void CreateList-L(LinkList L,int n){
//正位序输入n个元素的值,建立带表头结点的单链线性表L
if(( L=(LinkList )malloc(sizeof(Lnode)))==NULL)
exit(1);
L–>next=null;//先建立一个带头结点的单链表(头结点的指针域为空)
q=L;
int i;
for(i=1;i<=0;++i) {
if(p=(LinkList )malloc(sizeof(Lnode)))=NULL)//生成新结点并检验申请内存是否成功
exit(1);
scanf(("%d",&p–>data); //输入元素值
q–>next=p;
q=q–>next; }//for
}// CreateList-L 算法的时间复杂度:O(listlength(L))