网站怎么自己做,手机关联网站,重庆网站推广团队,网站设计师薪资参考链表的物理存储结构是用一组地址任意的存储单元存储数据的。不像顺序表占据连续的一段内存空间#xff0c;而是将存储单元分散在内存的任意地址上。 链表结构中#xff0c;每个数据元素记录都存放到链表的一个节点#xff08;node#xff09;中#xff0c;而每个节点之间由…链表的物理存储结构是用一组地址任意的存储单元存储数据的。不像顺序表占据连续的一段内存空间而是将存储单元分散在内存的任意地址上。 链表结构中每个数据元素记录都存放到链表的一个节点node中而每个节点之间由指针将其连接在一起形成了”链“的结构、 链表每个节点中都必须有一个专门用来存放指针地址的域用这个指针域来存放后继结点的地址这样就达成了连接后继结点的目的。 一条链表通常有1个”表头“是一个指针变量用来存放第一个节点地址。此外一条链表的最后一个节点的指针域要置空NULL表示该节点为链表的尾节点因为它之没有后继结点了。 链表特征 1每个节点包括两部分数据域和指针域。其中数据域用来存放数据元素本身的信息指针域用来存放后继结点的地址。 2链表逻辑上是连续的而物理上不一定连续存储节点、 3只要获得链表的头节点就可以通过指针遍历整条链表。 实例编写一个程序要求从终端输入一组整数大于10个数以0作为结束标志将这一组整数存放在一个链表中结束标志0不包括在内打印出该链表中的值。然后删除该链表中的第五个元素打印出删除后的结果。最后在内存中释放掉该链表。 #includestdio.h
#includestdlib.h
typedef int ElemType;typedef struct node{ElemType data;struct node *next;
}LNode,*LinkList;LinkList GreatLinkList(int n) { //创建一个长度为n的链表 LinkList p,r,listNULL;ElemType e;int i;for(i1;in;i) {scanf(%d,e); //输入结点的内容 p(LinkList)malloc(sizeof(LNode));//为新建的结点开辟内存空间 p-datae; //元素赋值 p-nextNULL;if(!list)listp; //赋值链表头指针 elser-nextp; //将结点连入链表 rp;}return list; //返回链表头指针
}void insertList(LinkList *list,LinkList q,ElemType e) {//向链表中插入结点 e LinkList p;p(LinkList)malloc(sizeof(LNode));//为新建的结点开辟新的内存空间 生成一个新结点由p指向它 p-datae; //向该结点的数据域赋值e if(!*list) {*listp; //list内容为NULL时表示该链表为空赋值链表头指针 p-nextNULL;} //当链表为空时q没有意义只能在头结点后面插入第一个元素 else {p-nextq-next;//当链表不为空时认为q指向的结点一定存在将q指向的结点的next域的值赋给p指向结点的next域q-nextp; }
}void delLink(LinkList *list,LinkList q) { //删除链表的某结点 LinkList r;if(q*list) { //如果删除第一个结点 *listq-next;free(q);}else { //删除其他结点 for(r*list;r-next!q;rr-next)if(r-next!NULL) {r-nextq-next;free(q);}}
}void destroyLinkList(LinkList *list) { //销毁一个链表 LinkList p,q;p*list;while(p) { //循环释放掉每一个链表结点 qp-next;free(p);pq;}*listNULL;//将*list的内容置为NULL这样主函数中的链表list就为空防止了list变为野指针而且链表在内存中也完全被释放掉了。
}int main() {int e,i;LinkList l,q;qlGreatLinkList(l);//创建一个链表结点q和l都指向该结点 scanf(%d,e);while(e) { //循环输入数据同时插入新生成的结点 insertList(l,q,e);qq-next;scanf(%d,e);}ql;printf(the content of the linklist\n);while(q) { //输出链表中的内容 printf(%d,q-data);qq-next;}ql;printf(\nDelete the fifth element);for(i0;i4;i) { //将指针q指向链表的第五个元素 if(qNULL) { //确保此时链表的长度大于等于5否则将是非法操作 printf(the length of the linklist is smaller than 5!);}qq-next;}delLink(l,q); //找到链表中第五个元素用q指向它再删除q所指的结点 ql;while(q) { //打印出删除后的结果 printf(%d,q-data);qq-next;}destroyLinkList(l); //销毁该链表 return 0;
}创建链表注意 1用malloc()函数在内存的动态存储区堆内存中开辟一块大小为sizeof(LNode)的空间并将其地址赋给LinkList类型变量pLinkList为指向LNode变量的类型LNode为前面定义的链表结点类型。然后将数据e存入该结点的数据域data指针域存放NULL。 2若指针变量list为空说明本次生存的结点是第一个结点…… 3若指针变量list不为空说明本次生存的结点不是第一个结点将p赋给r-next。此处的r是一个LinkList类型变量永远指向原先链表的最后一个结点也就是要插入结点的前一个结点。 4再将p赋值给r目的是使r再次指向最后的结点以便生成链表的下一个结点即保证r永远指向原先链表的最后一个结点。 5重复1~4n次生成n个结点的链表 6最后生成的链表的头指针list返回主调函数通过list就可以访问到该链表的每一个结点。 删除链表注意 从非空链表删除q所指的结点考虑3种情况 1q所指向的是链表的第一个结点 2q所指向的结点的前驱结点的指针已知 3q所指向的结点的前驱结点的指针未知 销毁链表注意 链表使用完建议销毁因为链表本身会占用内存空间。若一个系统中使用很多链表而使用完又不及时销毁那么这些垃圾空间积累过多最终导致内存的泄露甚至程序的崩溃。 ———————————————————————— ———————————————————————— 程序运行时候删除第5个元素没有显示出预期结果。运行环境在DEV。转载于:https://www.cnblogs.com/dd2hm/p/6838694.html