C语言实现链表创建

C语言实现链表的创建

链表:是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

从链表的概念中不难得出,链表是由一系列结点组成的。
结点又包含有数据域和指针域,数据域存储数据元素,指针域则用来指向别的结点或者存储下一个结点地址,起到链接作用。


一.从百度百科的这副图片来简单理解一下链表的结构在这里插入图片描述

1.创建头结点head
2.在创建一个结点用来保存每次插入的结点p1
3.循环创建一般结点p2、p3…
4.将创建的结点与已有的结点链接起来
5.遍历链表并输出数据
注意!
我们需要使用malloc函数给结点分配内存,malloc用完最好free,防止造成内存泄漏

  • 链表的优点:灵活性。插入和删除操作时,只需修改被删节点上一节点的链接地址,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。
  • 链表的缺点: 随机访问。链表的访问取决于结点的位置,当需要随机访问结点时,在顺序存储结构中的效率低。

二.链表的相关操作

1.创建链表(前插法、尾插法、序插法、定位法)

  • 前插法:将新生成的结点依次插入头结点之后创建链表。
  • 尾插法:将新生成的结点依次插入到链表的最后面,作为新链表的最后一个结点。
  • 序插法:将新生成的结点依次插入后保证结点域数据的有序性。
  • 定位法:新生成的结点依次插入到链表中指定的位置中。

2.遍历链表:就是对于某一个数据结构中所有元素按照一定的顺序依次访问。对链表来说,就是从链表的头结点一直访问到链表的尾结点。

3.清空链表:把所有存有数据的结点清空释放出去(除了头结点以外)。

4.销毁链表: 把链表的东西全部清空,就不存在这个链表了,把包括头结点在内的所有节点释放掉。

5.链表逆序:把每一个节点指向的下一个节点的next的指针倒过来进而指向它的前面的那个节点。

三、代码示例

  • 我用尾插法来展示我对链表的理解,尾插法也是最容易理解的。
 /*尾插法建立链表*/#include #include struct list     //创建链表的结构体{int    data;                //创建数据域struct list *next;          //创建指针域};int main(int argc,char *argv[]){int n;                      //设置结点的个数int i;                      //设置创建的结点的个数struct list *head = (struct list *)malloc(sizeof(struct list));//创建头结点用malloc分配内存head->next = NULL;          //头结点指针初始化struct list *p;             //创建p结点,p结点用于记录链表尾结点p = head;                   //p结点指针赋值为头结点printf("从键盘输入链表长度是:\n");                                                                                                                                 scanf("%d",&n);printf("输入数据为:\n");/* 链表的创建*/ for(i=0;i<n;i++)            //循环创建结点{   struct list *p1=(struct list *)malloc(sizeof(struct list)); //创建p1结点,并分配内存scanf("%d",&p1->data);  //给p1结点赋值p->next = p1;           p1->next = NULL;        //让插在尾部的p1结点的指针指向NULLp = p1;}/*链表的遍历*/p = head;                   //从头结点开始遍历while(p->next != NULL)      //只要p结点下一个结点不为空,证明还有结点存在,打印p后面结点的数据{printf("%d",p->next->data);p = p->next;            //p结点移动到下一个结点}printf("\n");/*清空链表*/p=head->next;               //让p结点指向头结点下一位while(head->next!=NULL)     //当头结点下一位一直不为空时{head->next=p;           //将头结点下一位赋予pp=p->next;              //新的p结点=头结点下一位的下一位 直到尾结点=头结点free(head->next);head->next=NULL;        //确保头结点下一位为空}printf("clean the list sucessfuly!\n");return 0;}

运行得到结果显示如下:
在这里插入图片描述


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部