线性表有顺序存储结构和链表存储结构,前者即是在相邻的一段内存中顺序存储的结构,后者是在不相邻内存中的存储结构。
1.单向链表构造原理
用一组地址任意的存储单元(连续的或不连续的)依次存储线性表的各个数据元素,数据元素之间的逻辑关系通过链指针间接地反映出来。.
上述结构成为单向链表,即一个链表域中有一个指针,同样还有双向链表等等。
2. 常见操作
a)求链表长度 a1 a2 a3 // 此处应关注这个框架是访问链表的框架
while(p!=NULL) //链表访问框架 { /* my work code */ p=p->link; }
int length(struct node * p) // p 是链表头 { n=0 //n为计数 while(p!=NULL) //每次进入相当于已经访问到一个非空链表域 { n=n+1;
p=p->link;
return n; } }
b)建立单向链表
void CreateLinkList() //从后往前建立 最后的list为链表第一个域的指针 { list=NULL; for(i=1;i<n;i++) { ch=getchar(); p=(struct node*)(malloc(sizeof(struct node)); p->data=ch; p->link=NULL; p->link=list; //更新link list=p; //更新list } }
调试结果:
c) 在指针q指向的链结点后插入一个数据域为item的新节点
void insert(struct node* list, struct node* q, char ch) { struct node *p = (struct node*)malloc(sizeof(struct node)); if (list == NULL) { p->data = ch; p->link = NULL; list = p; } else {
p->data=ch; p->link = q->link; q->link = p; } }
执行结果:
d)从非空链表中删除q指向的节点
void deletenode(struct node *lis,struct node * q) { struct node * r; struct node * m=NULL; if (q == lis) list = q->link; else { r = list; while (r != NULL) { if (r->link == q) m = r; r = r->link; } m->link = q->link; } }
后记:
线性表的顺序存储与链表存储的优缺点: