与顺序表相同,链表也是一种线性表,它的数据的逻辑组织形式是一维的。而与顺序表不同的是,链表的物理存储结构是用一组任意地址的存储单元存储数据的。也就是说,它不像顺序表那样占据一段连续的内存空间,而是将存储单元分散在内存的任意地址上。说道这可能让我们联想到我们对FALASH、SD卡、盘等存储介质的“块”、“页”读写操作有点像呀。其他我们平时写代码几乎用不到链表的知识,大多数都是应用开发,就算您是从事嵌入式开发的也很少用到的,一般在uboot、kernel中有这样用法,毕竟这些内容一般出厂都是现成的,我们也用不到改。如果您搞算法这对您来说很简单了,在这记录下说不定我们那个项目中就要用到链表的知道,也当给大家一个入门小知识。
代码可以直接运行:
#include "stdio.h"
typedef int ElemType;
typedef struct node{
ElemType data; /*数据域*/
struct node *next; /*指针域*/
}LNode,*LinkList;
LinkList GreatLinkList(int n){
LinkList p,r,list=NULL;
ElemType e;
int i;
for(i=1;i<=n;i++){
scanf("%d",&e);
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=NULL;
if(!list)
list=p;
else
r->next=p;
r=p;
}
return list;
}
/*向链表中写数据*/
void insertList(LinkList *list,LinkList q,ElemType e){
LinkList p;
p=( LinkList)malloc(sizeof(LNode));
p->data=e;
if(!*list){
*list=p;
p->next=NULL;
}
else{
p->next=q->next;
q->next=p;
}
}
/*删除q所指的结点*/
void delLink(LinkList *list ,LinkList q){
LinkList r;
if(q==list){
*list=q->next;
free(q);
}
else{
for(r=*list;r->next!=q;r=r->next);
if(r->next!=NULL){
r->next=q->next;
free(q);
}
}
}
/*释放掉该链表*/
void destroyLinkList(LinkList *list){
LinkList p,q;
p=*list;
while(p){
q=p->next;
free(p);
p=q;
}
*list=NULL;
}
main()
{
int e,i;
LinkList l,q;
q=l=GreatLinkList(1); /*创建一个链表结点,q和l指向该结点*/
scanf("%d",&e);
while(e) /*循环地输入数据,同时插入新生成的结点*/
{
insertList(&l,q,e) ;
q=q->next;
scanf("%d",&e);
}
q=l;
printf("The content of the linklist\n");
while(q) /*输出链表中的内容*/
{
printf("%d ",q->data);
q=q->next;
}
q=l;
printf("\nDelete the fifth element\n");
for(i=0;i<4;i++) /*将指针q指向链表第5个元素*/
{
if (q == NULL) {
printf("The length of the linklist is smaller than 5 !");
getche();
return;
}
q=q->next;
}
delLink(&l,q); /*删除q所指的结点*/
q=l;
while(q) /*打印出删除后的结果*/
{
printf("%d ",q->data);
q=q->next;
}
destroyLinkList(&l); /*释放掉该链表*/
getche();
}