《数据结构与算法》讲义

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》

实验课讲义

实验一线性表基本操作的实现

1.1单链表的运算

1、建立单链表

假设线性表中结点的数据类型是字符,我们逐个输入这些字符型的结点,并以换行符'\n'为输入条件结束标志符。动态地建立单链表的常用方法有如下两种:

(1)头插法建表

①算法思路

从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表头上,直到读入结束标志为止。

注意:该方法生成的链表的结点次序与输入顺序相反。

②具体算法实现

LinkList CreatListF(void)

{//返回单链表的头指针

char ch;

LinkList head;//头指针

ListNode *s; //工作指针

head=NULL; //链表开始为空

ch=getchar(); //读入第1个字符

while(ch!='\n'){

s=(ListNode *)malloc(sizeof(ListNode));//生成新结点

s->data=ch; //将读入的数据放入新结点的数据域中

s->next=head;

head=s;

ch=getchar(); //读入下一字符

}

return head;

}

(2)尾插法建表

①算法思路

从一个空表开始,重复读入数据,生成新结点,将读入数据存放在新结点的数据域中,然后将新结点插入到当前链表的表尾上,直到读入结束标志为止。

②具体算法实现

LinkList CreatListR(void)

{//返回单链表的头指针

char ch;

LinkList head;//头指针

ListNode *s,*r; //工作指针

head=NULL; //链表开始为空

r=NULL;//尾指针初值为空

ch=getchar(); //读入第1个字符

while(ch!='\n'){

s=(ListNode *)malloc(sizeof(ListNode));//生成新结点

s->data=ch; //将读入的数据放入新结点的数据域中

if (head!=NULL)

head=s;//新结点插入空表

else

r->next=s;//将新结点插到*r之后

r=s;//尾指针指向新表尾

ch=getchar(); //读入下一字符

}//endwhile

if (r!=NULL)

r->next=NULL;//对于非空表,将尾结点指针域置空head=s;

return head;

}

2.插入运算

(1)思想方法

插入运算是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。

具体步骤:

(1)找到ai-1存储位置p

(2)生成一个数据域为x的新结点*s

(3)令结点*p的指针域指向新结点

(4)新结点的指针域指向结点ai。

(2)具体算法实现

void InsertList(LinkList head,DataType x,int i)

{//将值为x的新结点插入到带头结点的单链表head的第i个结点的位置上

ListNode *p;

p=GetNode(head,i-1);//寻找第i-1个结点

if (p==NULL)//i<1或i>n+1时插入位置i有错

Error("position error");

s=(ListNode *)malloc(sizeof(ListNode));

s->data=x;s->next=p->next;p->next=s;

}

(3)算法分析

算法的时间主要耗费在查找操作GetNode上,故时间复杂度亦为O(n)。

3.删除运算

(1)思想方法

删除运算是将表的第i个结点删去。

具体步骤:

(1)找到ai-1的存储位置p(因为在单链表中结点ai的存储地址是在其直接前趋结点ai-1的指针域next中)

(2)令p->next指向ai的直接后继结点(即把ai从链上摘下)

(3)释放结点ai的空间,将其归还给"存储池"。

(2)具体算法实现

void DeleteList(LinkList head,int i)

{//删除带头结点的单链表head上的第i个结点

ListNode *p,*r;

p=GetNode(head,i-1);//找到第i-1个结点

if (p==NULL||p->next==NULL)//i<1或i>n时,删除位置错

Error("position error");//退出程序运行

r=p->next;//使r指向被删除的结点ai

p->next=r->next;//将ai从链上摘下

free(r);//释放结点ai的空间给存储池

}

2.3.3循环链表(Circular Linked List)

循环链表是一种首尾相接的链表。

1、循环链表

(1)单循环链表——在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可。

(2)多重链的循环链表——将表中结点链在多个环上。

2、带头结点的单循环链表

注意:判断空链表的条件是head==head->next;

3、仅设尾指针的单循环链表

用尾指针rear表示的单循环链表对开始结点a1和终端结点an查找时间都是O(1)。而表的操作常常是在表的首尾位置上进行,因此,实用中多采用尾指针表示单循环链表。带尾指针的单循环链表可见下图。

相关文档
最新文档