单链表的经典问题

单链表中的节点类型描述如下:

typedef struct link {
 int data;
 link* next;
}node,*linklist;
  1. 使用尾插法(头插法)创建一个带头节点(不带头节点)的单链表
void Creat_list_Head(linklist& L) {//创建一个带头节点的单链表
 //尾插法
 /*int x;
 L = (node*)malloc(sizeof(node*));//先创建一个头节点
 L->next = NULL;
 node* r = L;//用指针r指向链表的最后一个节点
 while (cin>>x&&x>0) {
  node*s= (node*)malloc(sizeof(node*));
  s->data = x;
  s->next = r->next;
  r->next = s;
  r= s;
 }*/
 //头插法
 int x;
 L = (node*)malloc(sizeof(node*));//先创建一个头节点
 L->next = NULL;
 while (cin >> x && x > 0) {
  node* s = (node*)malloc(sizeof(node*));//生成一个新节点
  s->data = x;
  s->next = L->next;
  L->next = s;
 }
}
  1. 使用尾插法(头插法)创建一个不带头节点的单链表
void Creat_list_withoutHead(linklist& L) {//创建一个不带头节点的单链表
 //头插法
 /*int x;
 L=NULL;
 while (cin >> x&&x > 0) {
  node* s = (node*)malloc(sizeof(node*));//生成一个新的头节点
  s->data = x;
  s->next = L;
  L = s;
 }*/
 //尾插法
 int x;
 node* r =L;//指针r指向单链表的尾节点
 L = NULL;
 while (cin >> x && x > 0) {
  node* s = (node*)malloc(sizeof(node*));//生成一个新的头节点
  s->data = x;
  if (L == NULL) {//单链表为空
   L = s;
   L->next = NULL;
   r = s;
  }
  else {//单链表非空
   s->next = r->next;
   r->next = s;
   r = s;
  }
 }
}

3.在该单链表(带头节点)的第x个元素前插入一个整数y (从0开始)

void Add_before_x(linklist& L, int x, int y) {//在该单链表的第x个元素前插入一个整数y  (从0开始)
 node* p = L->next;
 int t = 0;
 if (x < 0) {
  cout << "error 不存在第i个元素 插入失败" << endl;
  return;
 }
 while (p != NULL && t < x - 1) {//找到第x个元素的前一个节点
  p = p->next;
  t++;
 }
 if (x == 0) {
  p = L;
 }
 if (p != NULL) {//该链表存在第x-1个节点
  node* s = (node*)malloc(sizeof(node*));//生成一个新节点
  s->data = y;
  s->next = p->next;
  p->next = s;
 }
 else {
  cout << "error 不存在第i个元素 插入失败" << endl;
 }
}

4.删除单链表(带头节点)中的第i个元素(从0开始)

void Delet_x(linklist& L, int i) {//删除该链表中的第i个元素,其值通过参数将其返回(从0开始)
 if (i < 0) {
  cout << "error 不存在第i个元素 删除失败" << endl;
  return;
 }
 node* p = L->next;
 int t = 0;
 while (p != NULL && t < i - 1) {//找到第i-1个节点
  p = p->next;
  t = t + 1;
 }
 if (i == 0) {
  if (L->next== NULL) {
   cout << "error 不存在第i个元素 删除失败" << endl;
   return;
  }
  p = L;
 }
 if (p == NULL||p->next==NULL) {
  cout << "error 不存在第i个元素 删除失败" << endl;
  return;
 }
 node* q = p->next;
 p->next = q->next;
 //free(q);
}

5.单链表(带头节点)的逆置

void reverse(linklist& L) {
 node* p = L->next;
 node* rear = NULL;//rear为p节点的后继节点,防止断链
 L->next = NULL;
 while (p != NULL) {
  rear = p->next;
  p->next = L->next;
  L->next = p;
  p = rear;
 }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值