C初_单链表

1.链表的作用

链表是动态分配存储空间的链式存储结构
链式(元素与元素间没有地址紧邻)存储线性表(具有唯一的前驱与后继)

2.链表存储的含义

当一个序列中只含有指向它的后继结点的链接时,称该链表为单链表
数据位置不连续,通过指针进行相互关联
单量表中第一个节点不存数据,只存指针,称为头指针
链表中每个元素称为“结点“,每个节点由数据和指向下一个位置的指针组成
最后一个节点的指针指向空
单链表的结构

3.增删查改的实例

在对链表进行增删查改的操作时,应先定义一个用于进行增删查改的结构体
定义如下:

typedef struct node
{
int data;//一个数据
struct node* next;指向下一个节点的位置
}//相当于结点

在定义结点之后要申请为其初始化

NODE* init()
{
NODE* p=(NODE*)malloc(sizeof(NODE));//申请堆内存
p->next=NULL;
return p;
}

3.1 对链表增加元素

void insertData(NODE *head,int data)
{
NODE* head=(NODE*)malloc(sizeof(NODE));
head->next=NULL;
NODE* p=(NODE*)malloc(sizeof(NODE));
p->data=data;
p->next=head->next;
head->next=p;
}

4.说明

单量表的头结点不存数据
数组和链表的优缺点
增:数组在尾部插入方便,其他位置不方便;链表在任意一个地方都很方便插入
删:数组在尾部删除方便,链表在任意地方删除方便
改:数组和链表修改都很方便
查:有序条件下,数组二分查找比较方便 ,链表只能一步步查找

5.代码实例

#include<stdio.h>
#include<string>
typedef struct node
{
 int data;//数据
 struct node*next;//指向下一个节点的位置
}NODE;
NODE *init();//初始化操作 给head赋值 也可以用参数的方式给head赋值
void insertData(NODE *head,int data);//给链表赋值,传递需要插入的数据并且传入head指针
void deleData(NODE *head, int data);//
void findData(NODE *head, int data);
void deleALL(NODE *head, int data);
void print(NODE *head);
int main()
{
 NODE *head;//头指针 保存一个节点的位置,可以找到所有节点的位置,如果想在其他函数中修改head指针,那么需要传递head的地址
 head = init();
 for (int i = 0; i < 10; ++i)
 {
  insertData(head, i);
 }
 //insertData(head, 23);
 print(head);
 getchar();
 return 0;
}
NODE *init()
{
 NODE *p = (NODE *)malloc(sizeof(NODE));
 p->next = NULL;
 return p;
}
void insertData(NODE *head, int data)
{
 //给结构体指针申请一个堆内存
 NODE *p = (NODE*)malloc(sizeof(NODE));
 p->data = data;
#if 1
 //头插方式给数据进行插入
 p->next = head->next;
 head->next = p;
#else
 NODE *q;
 while (q->next != NULL)q = q->next;
 q->next = p;
 p->next = NULL;
#elseif
 NODE *q = head;
 for (int i = 0; i < 2; ++i)
 {
  q = q->next;
 }
 p->next = q->next;
 q -> next = p;
#endif
}
void deleData(NODE *head, int data)
{
 NODE *p = head;
 while (p != NULL&&p->next!=NULL)
 {
  if (p->next->data == data)
  {
   NODE *q = p->next;
   p->next = p->next->next;
   free(q);
  }
  else
  {
   p = p->next;
  }
 }
}
void findData(NODE *head, int data)
{
 //查找在有序的前提下,用二分查找,如果无需还需要排序或者用二叉树等
}
void deleALL(NODE *head, int data)
{
 //从头开始删除
 NODE *p, *q;
 p = head;
 while (p != NULL)
 {
  q = p;
  p = p->next;
  free(q);
 }
}
void print(NODE *head)
{
 NODE *p = head;
 while (p != NULL)
 {
  printf("结点地址%p,data=%d,next=%p\n\n", p, p->data, p->next);
  p = p->next;
 }
}

猜你喜欢

转载自blog.csdn.net/weixin_41743247/article/details/88978416