單鏈表A分解為兩個(gè)帶頭結(jié)點(diǎn)的單鏈表A和B,使得A表中含有原表中序號為奇數(shù)的元素

#include <stdio.h>
typedef struct MyStruct
{
  int data;
  struct MyStruct * next;
}node,*pnode;
void newlink(pnode L);
void show(pnode L);

int main() {
  node a, L1, L2, L3, L4,L5,L6, L7;
  L7.data = 7;
  L7.next = NULL;
  L6.data = 6;
  L6.next = &L7;
  L5.data = 5;
  L5.next = &L6;
  L4.data = 4;
  L4.next = &L5;
  L3.next = &L4;
  L3.data = 3;
  L2.next = &L3;
  L2.data = 2;
  L1.data = 1;
  L1.next = &L2;
  a.next = &L1;
  a.data = NULL;
  pnode L = &a;
  //L指向頭結(jié)點(diǎn)
  newlink(L);
  printf("\n");
  system("pause");
  return 0;
}

void newlink(pnode L) {
  printf("原來鏈表的順序?yàn)椋篭n");
  show(L);
  pnode p, q, s, b, a;
  //處理a鏈表
  a = L;
  //a指向原來鏈表的頭結(jié)點(diǎn)
  q = s = a;
  //q作為鏈表a的工作指針
  s = s->next;
  //s作為鏈表的后移指針

  //處理b鏈表
  node top2;
  b = &top2;
  //為b鏈表生成一個(gè)頭結(jié)點(diǎn)
  b->next = NULL;
  //讓b指向鏈表的頭結(jié)點(diǎn)
  p = b;
  //把b賦值給p,讓p作為鏈表b的工作指針,作為后移指針用

  int i = 0;
  while(s!= NULL) {
      i++;
      if (i%(int)2== 0)
      {
          p->next = s;
          p = p->next;
      }
      else {
          q->next = s;
          q = q->next;
      }
      s = s->next;
  }
  //這里循環(huán)后要把兩個(gè)鏈表的尾指針指向的位置都清空,這一步一定要做,不然結(jié)果就會(huì)莫名秒
  /*p->next = NULL;
  q->next = NULL;*/
  printf("\n鏈表a的順序?yàn)椋篭n");
  show(a);
  printf("\n鏈表b的順序?yàn)椋篭n");
  show(b);
}

void show(pnode L) {
  L = L->next;
  //從頭結(jié)點(diǎn)移向第一個(gè)結(jié)點(diǎn)
  while (L!=NULL)
  {
      printf("\t%d", L->data);
      L = L->next;
  }

}
正確結(jié)果.png
不清空尾指針的錯(cuò)誤結(jié)果.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容