牛骨文教育服务平台(让学习变的简单)
博文笔记

[List]C语言实现链表

创建时间:2015-07-11 投稿人: 浏览次数:3122
   问题描述:数据结构中了解过链表,由一连串结点组成,有单向链表和双向链表之分。以下为单向链表一些知识的学习。    链表结点:单向链表每个节点包含一个节点数据项,一个指向下一节点的指针。最后一个节点因为没有下一个节点了,其指针为空指针, struct node {     int value;     struct node *next; }; struct node *first = NULL;  // 初始化链表空    由于这里结构内有一个指向相同结构类型的指针成员,因此不能使用typedef的结构声明方式。    创建节点:首先要为节点分配内存单元,然后把数据存储到结点,最后把结点插入到链表。 struct node *new_node; new_node = malloc(sizeof(struct node));  //为节点分配内存空间    由于new_node是一个指向结构的指针,对其赋值可以用间接寻址*,然后再用.操作符获取其中变量,另外也可以用->操作符直接操作, (*new_node).value = 100; 或者 new_node->value = 100;     在链表头插入结点, next_node->next = first; first = new_node;    此时first为链表头,即第一个节点,其next指针指向节点自身。    搜索链表:for语句是首选,搜索链表惯用法: for(p = first; p!=NULL; p = p->next) ……    删除结点:首先要定位要删除的结点,接着改变前一个结点,让其绕过删除结点,最后需调用free函数回收内存, struct node *delete_from_list(struct node *list, int n){     struct node *cur,*prev;    for(cur=list,prev=NULL;cur!=NULL&&cur->value!=n;prev=cur,cur=cur->next)        ;     if(cur==NULL)   // 未找到元素        return list;     if(prev==NULL)  // 元素在第一个结点        return list = list->next;     else        prev->next =cur->next;     free(cur);     return list; }    有序链表:即链表中结点有序,按照结点中数据进行排序的。虽然有序链表的插入要麻烦一点,但是搜索会更快,不需要从头到尾的遍历。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。