单链表操作,创建,反转,反转,反转

  包含创建,反转,,反转,去重,反转

#include<cstdio>
#include<stdlib.h>
#include<iostream>
using namespace std;

typedef struct list_node{
  int info;
 struct list_node *next;
}node;

node *newlist()
{
 int x,z;
 node *head=(node*)malloc(sizeof(node));
 if(head==NULL)
 {
   printf("分配失败\n");
   exit(-1);
 }
 node *tail=head;
 tail->next=NULL;
 printf("输入链表长度:");
 scanf("%d",&x);
 for(int i=0;i<x;i++)
 {
  printf("请输入第%d个:",i+1);
  scanf("%d",&z);
  node *ne=(node*)malloc(sizeof(node));
  if(ne==NULL)
  {
    printf("分配内存失败\n");
    exit(-1);
  }
  ne->info=z;
  tail->next=ne;
  ne->next=NULL;
  tail=ne;
 }
 return head;
}

void display(node *head)
{
 node *p;
 p=head->next;
 if(!p){printf("单链表为空!\n");}
 while(p)
 {
  printf("%-5d",p->info);
  p=p->next;
 }
 printf("\n");
}

node *Reverse(node *head)///带头结点的单链表反转
{
 node *q,*pre,*r;
 q=head->next;
 if(!q){
    printf("该单链表为空\n");
  return head;
 }
 pre=q->next;
 if(!pre) return head;///单链表长度为1,不用反转
 while(pre)
 {
  r=pre->next;///保存pre的下一节点地址
  pre->next=q;///反转
  q=pre;      ///移位
  pre=r;      ///移位
 }
 head->next->next=NULL;
 head->next=q;///因为带头结点,所以是pre不是q!!
 printf("反转结束\n");
 return head;
}

void insert1(node *head)///顺序插入
{
 int x;
 printf("输入插入的数\n");
 scanf("%d",&x);
 node *q,*pre,*p;
 q=head->next;
 pre=head;           ///如果x大于链表首结点,直接插入到(pre)head后面
 while(q&&q->info<=x)
 {
  pre=q;
  q=q->next;
 }
 p=(node*)malloc(sizeof(node));
 p->info=x;

 pre->next=p;
 p->next=q;
 printf("插入完成\n");
}

void repeatdelete(node *head)
{
    node *p,*q,*r;
    p=head->next;
    while(p)
    {
         q=p;
         while(q->next)
         {
             if(q->next->info==p->info)
             {
                 r=q->next;
                 q->next=r->next;
                 free(r);
             }
             else q=q->next;
         }
         p=p->next;
    }
    printf("已经去重\n");
}


void sort1(node *head)///排序
{
 node *p,*pre,*z;
 int t;
 p=head->next;
 z=head->next;
 if(!p){
   printf("链表为空,不用排序\n");
   return ;
 }
 pre=p->next;
 if(!pre){
   printf("单链表长度为1,不用排序\n");
   return ;
 }
  while(z)
    {
       p=head->next;
       pre=p->next;
       while(pre)
         {
          if(pre->info>p->info)
          {
           t=pre->info;///相当于swap
           pre->info=p->info;
           p->info=t;
          }
          p=p->next;///移位
          pre=p->next;
         }
       z=z->next;///z用与第一层循环计数
    }
  printf("排序完成\n");
}

void free1(node *head)
{
 node *p,*q;
 p=head->next;
 while(p)
 {
  q=p->next;
  free(p);
  p=q;
 }
 head->next=NULL;
}

int main()
{
 node *head;
 head=newlist();///创建
 display(head);

 Reverse(head);///反转
 display(head);

 insert1(head);///顺序插入
 display(head);

 repeatdelete(head);///去重
 display(head);

 sort1(head);///排序
 display(head);

 free1(head);
 display(head);
 return 0;
}

 

转载于:https://www.cnblogs.com/wangtao971115/p/10358352.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,单链表反转是一个常见的数据结构操作,通常通过迭代或递归的方式来实现。这里我会介绍一种常见的迭代方法: **迭代法(Node指针):** ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 反转链表函数 Node* reverseList(Node* head) { if (head == NULL || head->next == NULL) { return head; } Node* prev = NULL; // 初始化前驱指针 Node* curr = head; // 初始化当前指针 // 遍历链表,每次将当前节点的next指向前驱节点 while (curr != NULL) { Node* temp = curr->next; // 保存当前节点的下一个节点 curr->next = prev; // 将当前节点的next指向前驱 prev = curr; // 前驱指针前进 curr = temp; // 当前指针前进到下一个节点 } return prev; // 最终返回新的头节点 } // 测试反转操作 void printList(Node* head) { while (head != NULL) { printf("%d -> ", head->data); head = head->next; } printf("NULL\n"); } int main() { // 创建一个测试链表 Node* head = createLinkedList(); // 假设createLinkedList()是创建链表的函数 printList(head); // 打印原始链表 head = reverseList(head); // 反转链表 printList(head); // 打印反转后的链表 return 0; } ``` **相关问题:** 1. 迭代法和递归法在链表反转中的区别是什么? 2. 如果链表中有环,上述代码还能正确反转吗?为什么? 3. 除了迭代法,还有哪些方法可以实现单链表反转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值