单链表(linux c)

  因为之前对链表反转这一块一直记忆不清,现在复习总结一下,只要还是要了解复习指针地址操作,结构体定义。

  方法1:采用前插得方法,把节点从前边取出来然后再插到前边;分三步(具体看分解图)

  <一>先将第一个数字节点和头断开,然后接到链表最后

  <二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边

  <三>直到将所有的节点插完,然后将新的头结点和head相连

  先上完整的反转代码。。链表中存入了15个数

  

  

void fanxu(list *plist)

  {

  //标记首先需要的三个节点

  list *pwei=plist;

  list *per=plist->pnext;

  list *ptemp=NULL;

  while(pwei->pnext!=NULL)

  {

  pwei=pwei->pnext;

  }

  while(pwei!=per)

  {

  ptemp=per; //永远标记第二个节点

  per=per->pnext;

  //第一次要把链表头断掉

  if(pwei->pnext==NULL)

  {

  pwei->pnext=ptemp;

  ptemp->pnext=NULL; //断掉

  }

  else

  {

  ptemp->pnext=pwei->pnext; //前插

  pwei->pnext=ptemp; //然后再一块接到尾指针

  }

  plist->pnext=per; //为了打印显示,可以省

  printf("per-jietou--****************************************************************************************\n");

  showlist(plist);

  plist->pnext=pwei; //为了打印显示,可以省

  printf("pwei-jietou--***************************************************************************************\n");

  showlist(plist);

  printf("\n\n\n");

  }

  plist->pnext=per;

  }

  

  第一步:<一>先将第一个数字节点和头断开,然后接到链表最后

  第二步:<二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边

  ………

  第三步: <三>直到将所有的节点插完,然后将新的头结点和head相连

  ########################################################################################

方法2:在方法1的基础上改进简化(创建新标志位) 主要理解while(p)是判断节点p的地址,p=q 是地址之间的重新赋值

  <一>定义三个新的节点标志位p q pr 将链表的前一个节点插下来;

  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点

  <三>插完之后将新的标志位连接到之前的头结点打印

  ****************************************************************************************************************

  

void fanxu_gao(list *plist)

  {

  list *pr;

  list *p=plist->pnext;

  list *q=NULL;

  plist->pnext =NULL;

  while(p)

  {

  pr=p->pnext; //记录第二个地址

  p->pnext=q;

  q=p; //可以理解成给q和p重新赋值新地址

  p=pr; //标记第二个地址

  plist->pnext=q; //打印显示,可以没有

  printf("qqqqqqqqqqqqqqqqqg#############################################\n");

  showlist(plist);

  plist->pnext=p; // 打印显示可以没有

  printf("ppppppppppppppppppppz#############################################\n");

  showlist(plist);

  printf("\n\n\n");

  }

  plist->pnext=q;

  }

  ************************************************************************************************************************

  <一>定义三个新的节点标志位p q pr 将链表的前一个节点插下来;

  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点

  <三>插完之后将新的标志位连接到之前的头结点打印

  ***************************************************************************************************************************

最后在给大家分享些关于链表的资料可以进一步参考

单链表
http://www.makeru.com.cn/live/5413_1924.html?s=45051

C语言玩转链表
http://www.makeru.com.cn/live/1392_338.html?s=45051

指针
http://www.makeru.com.cn/live/1392_238.html?s=45051

原文地址:https://www.cnblogs.com/8734ujn/p/11583796.html

时间: 2024-11-03 18:25:55

单链表(linux c)的相关文章

嵌入式 Linux C语言(十二)——单链表

嵌入式 Linux C语言(十二)--单链表 一.单链表简介 1.单链表的结构 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以节点来表示的,每个节点由两部分构成:一个是数据域,存储数据值,另一个是指针域,存储指向下一个节点的指针. 2.单链表的节点 单链表节点的数据结构如下: typedef struct data { unsigned int id;//学生身份ID char name[LENGTH];//学生姓名 char subject[

单链表的小例子(一)

#include<stdio.h> #include<stdlib.h> #include<string.h> //定义一个存放数据的结构体 typedef struct { int num; char name[20]; }DATA; //定义链表 typedef struct node { DATA data; struct node *next; }NODE,*PNODE; DATA getData();//模拟接受数据 PNODE createNode(DATA

单链表及基本操作。(含练习)

1 ////////////////////////////////////////////// 2 //单链表的初始化,建立,插入,查找,删除. // 3 //(以及部分练习) // 4 //Author:Bread // 5 //Date: 2014.12.28 // 6 //Update 1th:2014.12.31 // 7 ////////////////////////////////////////////// 8 #include <stdio.h> 9 #include &l

单链表 - 插入和删除操作

下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示. 下面先来看程序(栈的链式存储实现,另外一个实现点这里)和对应的输出(注意输出前进行了链表反转(见<单链表反转>,否则程序后面的while循环输出的顺序是250,200,100),接着来分析程序: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

单链表逆置

重写单链表逆置,熟能生巧- #include <iostream> #include <cstdlib> using namespace std; typedef struct List{ int num; struct List *next; }ListNode,*pListNode; void display(ListNode *pHead) { while(pHead) { cout<<pHead->num<<"--"; pH

02 单链表

线性表之链式存储---单链表 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 // 数据结构 6 typedef struct node 7 { 8 int data; 9 struct node *next; 10 }linkList; 11 12 // 创建单链表,并初始化 13 linkList *linkList_init(void) 14 { 15 linkList *l

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

[c语言]单链表的实现

一.基础知识:链表(线性表的链式存储结构) (1)特点:逻辑关系相邻,物理位置不一定相邻. (2)分类: a.不带头节点 b.带头节点 (3)单链表的存储结构: typedef struct SListNode {  DataType data;  struct SListNode* next; }SListNode; 二.代码实现(因避开使用二级指针,所以代码中使用了c++中的引用):此处构造的为不带头节点的链表 (1)sList.h   #pragma once typedef int Da

单链表基本操作

//头文件 #pragma once #include <stdio.h> #include <assert.h> #include <malloc.h> #include <stdlib.h> typedef int DateType; typedef struct LinkNode {  DateType _data;  struct  LinkNode* _next; } LinkNode; void PrintList(LinkNode* pHead