}
}
}
if (p_Current->i_GeoLength>p_Mid->i_GeoLength) { } else { }
i_Hight=i_Mid-1; i_Low=i_Mid+1;
}//确定插入位置 //插入数据
for (i=1;i p_Hight->pst_Next=p_Current->pst_Next; p_Current->pst_Next=p_Mid; p_Low->pst_Next=p_Current; p_Low=p_Low->pst_Next; return pst_Road_Head; 参考文献:Kyle Loudon《算法精解》260-270 12. 单链表的使用 1) 单链表的基础知识 线性表(Chain)的连接存储结构成为单链表。为了能够正确的表示链表中元素之间的逻辑关系,每一个存储单元在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息成为指针。这两个部分组成了数据元素的存储映像,成为结点(ChainNode)。结构如下: datanext 图1 其中,data为数据域,用来存放数据元素;next为指针域,用来存放该结点的后继结点的地址。如下图所示,为单链表的存储示意图。从图中可以看出,除了最开始的结点,其他每个结点的存储地址都存放在其前驱结点的next域中。 图:链表有一个“头指针”变量,图中以head表示,它存放一个地址。该地址指向一个元素。可以看出,head指向第一个元素,第一个元素又指向第二个元素···直到指向最后一个元素,该元素不再指向其他元素,它称为“表尾”,它的地址部分存放一个“NULL”(表示“空地址”),链表到此结束。 头指针a1a2a3a4NULL 图2 2) 单链表的实现 单链表上进行定位,链表结点的插入、删除操作算法。 a) 定位 在链表中查找出第i个结点,若存在则返回该结点的地址,否则就返回表头结点的地址。 操作步骤:定义整型变量i_Temp和指针变量p,i_Temp初值为0,p指向表的头结点;判断i_Temp b) 插入 在第i个结点后面插入一个数值为x的新结点,用i=0表示将新结点插在表头结点之后,成为线性表的第一个结点。 操作步骤:首先,判断参数i是否正确,若i<0或者i的长度超过链表长度,则说明i不正确,无法进行插入操作;否则,先进行定位,确定第i个结点的地址p,在p结点的后面插入一个新结点: 为新节点分配存储单元 将x存入新结点的数值字段中 将p结点指针字段的值存入新结点的指针字段中 将新结点地址存入p结点的指针字段中 令线性表的长度值加1. c) 删除 删除线性表中的第i个结点 操作步骤:首先,判断参数i是否正确,若i<0或者i的长度超过链表长度,则说明i不正确,无法进行删除操作;否则,调用定位算法,令p指向第i个结点的前面一个结点,删除p节点的下一个结点: 将p结点指针字段的值存入变量q中(其中,q指向待删除的结点) 将q结点指针字段的值存入p结点的指针字段中 释放q结点所占的存储单元 令线性表长度减1. 例子:要求建立一个有3个学生的数据的单向动态链表,同时可以进行插入,删除。 代码如下: /***********定义一个用于单链表的结构体***************/ struct student { }; /*****************单链表创建************************/ long l_Num; float f_Score; struct student *next; struct student *creat(void) //创建链表,此函数带回一个指向链表头的指针 { }; /*****************输出单表链函数************************/ void print(struct student *head) { } /*****************清空单表链函数************************/ void Erase(struct student *head) { struct student *stu1,*stu2; stu1=head; while(stu1) { stu2=stu1->next; delete stu1; struct student *stu; printf(\stu=head; if(head!=NULL) { } do { printf(\stu=stu->next; struct student *head; struct student *stu1,*stu2; stu1=stu2=(struct student *)malloc(LEN);//开辟一个新单元 scanf(\head=NULL; while(stu1->l_Num!=0) { } stu2->next=NULL; return(head); i_Count=i_Count+1; if(i_Count==1)head=stu1; else stu2->next=stu1; stu2=stu1; stu1=(struct student *)malloc(LEN); scanf(\ i_Count=0; } while (stu!=NULL); } } stu1=stu2; /*****************删除单链表节点函数************************/ struct student *Del(struct student *head,long Del_Num) //删除节点 { 点 } /*****************插入单链表节点函数(按照学号顺序排序输入的,存在很大的局限性!!!)************************/ struct student *Insert(struct student *head,struct student *stud) //插入操作 (书上插入的代码有问题!!) { struct student *stu0,*stu1,*stu2; stu1=head; stu0=stud; //p0指向要插入的结点 if (head==NULL) { { }; if (Del_Num==stu1->l_Num)//找到了 { } else printf(\招不到该结点 return(head); if (stu1==head)// p1指向的首结点,把第二个结点地址赋值给head { } else stu2->next=stu1->next; printf(\i_Count=i_Count-1; head=stu1->next; stu2=stu1; stu1=stu1->next; struct student *stu1,*stu2; if (head==NULL) { } stu1=head; while (Del_Num!=stu1->l_Num&&stu1->next!=NULL)//p1指向的不是所要找的结点,并且后面还有结 printf(\ } else { } head=stu0;stu0->next=NULL; }//如果原来链表是空的 while ((stu0->l_Num>stu1->l_Num)&&(stu1->next!=NULL)) { } if (stu0->l_Num<=stu1->l_Num) { } else { } stu1->next=stu0; stu0->next=NULL; if (head==stu1) //插到第一个结点之前 { } else stu2->next=stu0; //插到p2指向的结点之后 head=stu0; stu2=stu1; //p2指向刚才p1指向的结点 stu1=stu1->next; //p1向后移动一个 i_Count=i_Count+1; return(head); /*****************单链表技术************************/ void Case_List() { struct student *head,stu; long Del_Num; int i_Choice; char c_temp; printf(\第十三层--链表技术:\\n\printf(\请创建单链表!\\n\ printf(\请您输入信息,输入0表示结束!\\n\head=creat(); print(head); fflush(stdin); printf(\输入成功!\\n\ printf(\、删除结点 2、插入节点 3、清空链表 。 请输入您的选择:\\n\c_temp=getchar(); i_Choice=atoi(&c_temp); while (i_Choice!=4)