C语言基础知识大全(5)

2019-01-05 11:10

}

}

}

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)


C语言基础知识大全(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:多聚A特异性核糖核酸酶(PARN)ELISA试剂盒说明书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: