初学数据结构,对顺序表与单链表的概念与操作有点模模糊糊,为此特地查阅了资料,了解了不少,以下是对他们的总结:
顺序表内存中地址连续,长度不变更,支持随机查找,可以在时间复杂度O(1)内查找元素,适用于大量访问元素而少量增添或删除的程序。链表内存地址非连续,长度可以变化,算法时间复杂度为O(n),适用于需要进行大量增添或删除元素操作,而对访问无需求的程序。
下面来看看他们的基本操作(查找,删除,插入)的区别:
顺序表的查找:
int GetElem(Seqlist L,int i,DateType *e) /*查找顺序表中第i个元素*/ { if(i<1||i>L.length) return -1; *e=L.list[i-1]; return 1; }
链表的查找:
ListNode*Get(LinkList head,int i) /*查找链表中第i个元素*/ { ListNode *p; int j; if(head->next==NULL) return NULL; if(i<1) return 0; j=0; p=head; while(p->next!=NULL&&j<i) { p=p->next; j++; } if(j==i) return p; else return NULL; }
顺序表按内容查找:
int LocateElem(Seqlist L,DateType e)/*查找顺序表e的位置*/ { for(i=0;i<L.length;i++) { if(L.list[i]==e) retuen i; } return 0; }
链表按内容查找:
ListNode*LocateElem(LinkList head,DateType e) { ListNode *p; p=head->next;/*指向第一个节点*/ while(p) { if(p->date!=e) p=p->next; else break; } return p; }
相比较而言,顺序表对查找的操作比链表要简单,可以随机查找,但是对插入与删除而言,链表要比顺序表来操作要更方便。因为顺序表的插入时要移动,从最后面开始,再倒数第二个,直到插入的后一个位置才停止,这增加了时间复杂度。删除也与此相似,要前移。
顺序表的插入:
int InserList(Seqlist *L,int i,DateType e) { int j; if(i<1||i>L.length)//位置合不合法 return -1; else if(L->length>SIZE) { printf("顺序表已经满了。"); return 0; } else for(j=L->length;j>=i;j--) L->List[j]=L->List[j-1];//后移 L->List[i-1]=e; L->length=L->length+1; retuen 1; }
顺序表的删除:
int DeleteList(Seqlist *L,int i,DateType e) { int j; if(i<1||i>L.length)//位置合不合法 return -1; else if(L->length==0) { printf("顺序表空的。"); return 0; } else for(j=i;j<=L->length;j++) L->List[j]=L->List[j-1];//前移 L->length=L->length-1; retuen 1; }
因为顺序表长度不变,所以操作前必须先判断。插入看满没满,删除看空不空,进行这两个操作都要看位置合不合理。
链表的插入:
Status ListInsert_L(LinkList &L, int i, ElemType e){ //在带头结点的单链线性表L中第i个位置之前插入元素e LinkList p=L , s; int j=0; while (p && j<i-1) {p=p->next; ++j;} //寻找第i-1个结点 if (!p || j>i-1) return ERROR; //i小于1或者大于表长 s=(LinkList) malloc (sizeof (LNode)); //生成新结点 s->data=e; s->next=p->next; //插入L中 p->next=s; return OK; }//ListInsert_L
链表的删除:
Status ListDelete_L(LinkList &L, int i, ElemType &e){ //在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 LinkList p=L , q; int 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; }//ListDelete_L
时间: 2024-10-12 11:47:07