数据结构讲义第2章-线性表.ppt

数据结构讲义第2章-线性表

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * (2)按值查找 Locate_LinkList(L,x) Linklist Locate_LinkList( LinkList L, elemtype x) /*在带头结点的单链表L中查找值为x的结点,找到后返回其指针,否则返回空*/ { p=L-next; while ( p!=NULL p-data != x) p=p-next; return p; } 3.插入 (1)后插结点:设p指向单链表中某结点,s指向待插入的值为x的新结点,将*s插入到*p的后面,插入示意图如右图。 操作如下: ①s-next=p-next; ②p-next=s; 注意:两个指针的操作顺序不能交换。 在*p之后插入*s p s × ① ② (2)前插结点:设p指向链表中某结点,s指向待插入的值为x的新结点,将*s插入到*p的前面,插入示意图如图。 首先要找到*p的前驱*q 然后再完成在*q之后插入*s: s-next=q-next; q-next=s; 图 在*p之前插入*s s × p q { Lnode * p,*s; p=Get_LinkList(L,i-1); /*查找第i-1个结点*/ if (p==NULL) { printf("参数i错");return 0; } /*第i-1个不存在不能插入*/ else { s=malloc(sizeof(LNode)); /*申请、填装结点*/ s-data=x; s-next=p-next; /*新结点插入在第i-1个结点的后面*/ p-next=s return 1; } (3)插入运算 Insert_LinkList(L,i,x) int Insert_LinkList( LinkList L, int i, datatype x) /*在单链表L的第i个位置上插入值为x的元素*/ 4. 删除 (1)删除结点:设p指向单链表中某结点,删除*p。 首先要找到*p的前驱结点*q, 然后完成指针的操作即可: q-next=p-next; free(p); 图2.15 删除*p p q × (2)删除运算:Del_LinkList(L,i) int Del_LinkList(LinkList L,int i) /*删除单链表L上的第i个数据结点*/ { LinkList p,s; p=Get_LinkList(L,i-1); /*查找第i-1个结点*/ if (p==NULL) { printf("第i-1个结点不存在");return -1; } else { if (p-next==NULL) { printf("第i个结点不存在");return 0; } else { s=p-next; /*s指向第i个结点*/ p-next=s-next; /*从链表中删除*/ free(s); /*释放*s */ return 1; } } 2.3.3 循环链表 带头结点的单循环链表 (a)非空表 a1 H   an … (b)空表 H 单循环链表的连接操作示例: p= R1 –next; /*保存R1 的头结点指针*/ R1-next=R2-next-next; /*头尾连接*/ free(R2-next); /*释放第二个表的头结点*/ R2-next=p; /*组成循环链表*/。 两个用尾指针标识的单循环链表的连接 R2 b1   bn … × a1   an … R1 × p 2.3.4 双向链表 双向链表结点的定义: typedef struct dlnode { ElemType data; struct dlnode *prior,*next; }DLNode,*DLinkList; prior next data 结构特点: 设p指向双向循环链表中的某一结点,即 p中是该结点的指针,则 p-prior-next = p = p-next-pri

文档评论(0)

1亿VIP精品文档

相关文档