单链表(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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用冒泡排序算法对单链表进行排序的C语言代码: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表结构体 typedef struct node { int data; struct node *next; } Node; // 冒泡排序函数 void bubble_sort(Node *head) { Node *p, *q, *tail = NULL; int exchange = 1; while (exchange && head->next != tail) { exchange = 0; p = head; q = p->next; while (q != tail) { if (p->data > q->data) { int tmp = p->data; p->data = q->data; q->data = tmp; exchange = 1; } p = p->next; q = q->next; } tail = p; } } // 创建单链表函数 Node *create_list(int n) { Node *head = NULL, *tail = NULL, *p; int i, x; for (i = 1; i <= n; i++) { printf("请输入第%d个节点的值:", i); scanf("%d", &x); p = (Node *)malloc(sizeof(Node)); p->data = x; p->next = NULL; if (head == NULL) { head = p; } else { tail->next = p; } tail = p; } return head; } // 输出单链表函数 void print_list(Node *head) { Node *p = head; while (p != NULL) { printf("%d ", p->data); p = p->next; } } // 主函数 int main() { int n; Node *head; printf("请输入节点个数:"); scanf("%d", &n); head = create_list(n); printf("排序前的单链表为:"); print_list(head); bubble_sort(head); printf("\n排序后的单链表为:"); print_list(head); return 0; } ``` 其中,`bubble_sort()` 函数使用冒泡排序算法对单链表进行排序。`create_list()` 函数用于创建包含 `n` 个节点的单链表,并返回头结点指针。`print_list()` 函数用于输出单链表中的所有节点值。在 `main()` 函数中,先调用 `create_list()` 函数创建单链表,然后输出排序前的单链表,调用 `bubble_sort()` 函数进行排序,最后输出排序后的单链表

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值