ZHAO QIAN SUN LI ZHOU WU ZHENG WANG

  • Slides: 20
Download presentation

( ZHAO, QIAN, SUN, LI, ZHOU, WU, ZHENG, WANG) 存储地址 头指针 31 数据域 指针域

( ZHAO, QIAN, SUN, LI, ZHOU, WU, ZHENG, WANG) 存储地址 头指针 31 数据域 指针域 1 LI 43 7 QIAN 13 13 SUN 1 19 WANG NULL 25 WU 37 31 ZHAO 7 37 ZHENG 19 43 ZHOU 25

线性链表的逻辑表示 H ZHAO QIAN SUN ZHOU WU ZHENG LI WANG

线性链表的逻辑表示 H ZHAO QIAN SUN ZHOU WU ZHENG LI WANG

单链表的存储结构定义 typedef struct Lnode{ Elem. Type data; //数据域 struct Lnode *next; //指针域 }LNode, *Link.

单链表的存储结构定义 typedef struct Lnode{ Elem. Type data; //数据域 struct Lnode *next; //指针域 }LNode, *Link. List; Link. List p; LNode *p; data next

(1) 初始化单链表 Status Init. List_L(Link. List &L){ L=(Link. List) malloc(sizeof(LNode)); if(!L) return ERROR; L->next=NULL;

(1) 初始化单链表 Status Init. List_L(Link. List &L){ L=(Link. List) malloc(sizeof(LNode)); if(!L) return ERROR; L->next=NULL; return OK; }// Init. List_L T(n)=O(1)

(2) 单链表判空 Status List. Empty_L(Link. List L){ return (L->next==NULL); }// List. Empty_L T(n)=O(1)

(2) 单链表判空 Status List. Empty_L(Link. List L){ return (L->next==NULL); }// List. Empty_L T(n)=O(1)

(3) 求单链表的长度 int List. Length_L(Link. List L){ p=L->next; //p指向第一个结点 i=0; while(p){ //遍历单链表, 统计结点数 i++;

(3) 求单链表的长度 int List. Length_L(Link. List L){ p=L->next; //p指向第一个结点 i=0; while(p){ //遍历单链表, 统计结点数 i++; p=p->next; T(n)=O(n) } return i; }// List. Length_L p i=1 L a 1 p a 2 … an i=n

(4)取元素 Status Get. Elem_L (Link. List L, p=L->next; j=1; while(p && (j<i)){ p=p->next; ++j;

(4)取元素 Status Get. Elem_L (Link. List L, p=L->next; j=1; while(p && (j<i)){ p=p->next; ++j; } if(!p||j>i) return ERROR; e=p->data; return OK; }// Get. Elem_L int i, Elemtype &e){ //初始化, p指向第一个结点 // j为计数器 //顺指针向后查找, 直到p指向第i个元素 //或p为空 //第i个元素不存在 //取第i个元素 p j=1 L a 1 p … ai T(n)=O(n) j=i … an

(5)找元素位置 int Locate. Elem_L (Link. List L, Elem. Type e, Status(*compare)(Elem. Type, Elem. Type))

(5)找元素位置 int Locate. Elem_L (Link. List L, Elem. Type e, Status(*compare)(Elem. Type, Elem. Type)) { p=L->next; j=1; while(p && !(*compare(p->data, e)){ p=p->next; ++j; } if(p) return j; else return 0; //初始化, p指向第一个结点 // j为计数器 //顺指针向后查找 //直到p指向第i个元素 T(n)=O(n) } //Locate. Elem_L; p j=1 L a 1 p … e p->data=e … an

(6)找元素的前驱 Status Prior. Elem_L (Link. List L, Elem. Type cur_e, Elemtype &pre_e){ p=L; j=1;

(6)找元素的前驱 Status Prior. Elem_L (Link. List L, Elem. Type cur_e, Elemtype &pre_e){ p=L; j=1; while(p->next && !(*compare(p->next->data, cur_e)) p=p->next; j++; } T(n)=O(n) if(!p->next || j==1) return ERROR; pre_e=p->data; return OK; } // Prior. Elem_L p j=1 L a 1 p … aj-1 P->next->data=e e … an

(7)找元素的后继 Status Next. Elem_L (Link. List L, Elem. Type cur_e, Elemtype &next_e){ p=L->next; while(p

(7)找元素的后继 Status Next. Elem_L (Link. List L, Elem. Type cur_e, Elemtype &next_e){ p=L->next; while(p && !(*compare(p->data, cur_e)) p=p->next; } T(n)=O(n) if(!p || !p->next ) return ERROR; next_e=p->next->data; return OK; } // Next. Elem_L p j=1 L a 1 … e p P->data=e aj+1 … an

(8)单链表的插入 p p a b a s x (b)插入后 (a)插入前 s->next=p->next; p->next=s; b p->next=s

(8)单链表的插入 p p a b a s x (b)插入后 (a)插入前 s->next=p->next; p->next=s; b p->next=s s->next=p->next X

(8)单链表的插入 Status List. Insert_L(Link. List &L, int i, Elem. Type e){ p=L; j=0; while(p

(8)单链表的插入 Status List. Insert_L(Link. List &L, int i, Elem. Type e){ p=L; j=0; while(p && j<i-1){p=p->next; ++j; } //寻找第i-1个结点 if(!p||j>i-1) return ERROR; //i小于1或大于表长 s=(Link. List)malloc(sizeof(LNode)); //生成新结点 s->data=e; s->next=p->next; //插入L中 p->next=s; return OK; }//List. Insert_L T(n)=O(n)

(9)单链表的删除 q q->next p. . . a b c q = p->next=q->next p->next =

(9)单链表的删除 q q->next p. . . a b c q = p->next=q->next p->next = p->next . . .

(9)单链表的删除 Status List. Delete_L(Link. List &L, int i, Elem. Type &e){ p=L; j=0; while(p->next

(9)单链表的删除 Status List. Delete_L(Link. List &L, int i, Elem. Type &e){ p=L; j=0; while(p->next && j<i-1){ //寻找第i个结点, 并令p指向其前驱 p=p->next; ++j; } if(!(p->next && j<i-1) return ERROR; //删除位置不合理 q=p->next; p->next=q->next; //删除并释放结点 e=q->data; free(q); return OK; }//List. Delete_L T(n)=O(n)

(10)单链表的遍历 void List. Traverse_L (Link. List L, Status (*visit)(Elem. Type)) { p=L->next; while(p){ visit(p->data);

(10)单链表的遍历 void List. Traverse_L (Link. List L, Status (*visit)(Elem. Type)) { p=L->next; while(p){ visit(p->data); p=p->next; } }// List. Traverse_L Status visit(Elem. Type e){ printf(“The value of the element is %dn”, (int) e); return OK; } T(n)=O(n)