回 帖 发 新 帖 刷新版面

主题:[讨论]求单链表就地逆置的程序

请教各位大虾
单链表就地逆置的程序怎么写 ?[em16][em16]

回复列表 (共9个回复)

沙发

可以把当前单链表所有内容从头依次取出并删除,取出的元素插总在临时链表的头部
直至原链表无有效元素为止
最后把临时链表赋给原链表

板凳

准确的来说,不应该再设头指针了,应该再设两个指针,再利用头指针进行置逆
程序如下
#include<stdio.h>
typedef struct QLink
{
         int data;
         struct QLink *next;
}QLink;

main()
{
       
       QLink *head,*p,*q;
      int length,i;
      printf("此程序是实现链表置逆的功能.\n");
      printf("请输入链表的长度:");
      scanf("%d",&length);
      while(length<=0)
      {
          printf("输入错误,长度必须为自然数,请重新输入.\n");
          printf("请输入链表的长度:");
          scanf("%d",&length);
      }
      printf("现在要输入各结点的值.\n");
      for(i=1;i<=length;i++)
      {
            p=(QLink *)malloc(sizeof(QLink));
            scanf("%d",&p->data);
            p->next=NULL;
            if(i==1) head=p;
            else
            {
                 q=head;
                 while(q->next!=NULL) q=q->next;
                 q->next=p;
            }
      }
      printf("链表已建立,现在要将它输出.\n");
      p=head;
      for(i=1;i<=length;i++)
      {
            printf("%d  ",p->data);
            p=p->next;
      }
      printf("\n");
      printf("现在要将其置逆.\n");
      printf("程序置逆中……\n");
      printf("置逆成功.现在要将新的链表输出.\n"); 
      p=head;
      while(head->next!=NULL)
      {
           q=p;
           p=head->next;
           head->next=p->next;
           p->next=q;
      }
      head=p;
      p=head;
      for(i=1;i<=length;i++)
      {
            printf("%d  ",p->data);
            p=p->next;
      }
      system("pause"); 
}

3 楼

[quote]准确的来说,不应该再设头指针了,应该再设两个指针,再利用头指针进行置逆
程序如下
#include<stdio.h>
typedef struct QLink
{
         int data;
         struct QLink *next;
}QLink;

main()
{
       
       QLink *head,*p,*q;
      int length,i;
      printf("此程序是实现链表置逆的功能.\n");
      printf("请输入链表的长度:");
      scanf("%d",&length);
      while(length<=0)
      {
          printf("输入错误,长度必须为自然数,请重新输入.\n");
          printf("请输入链表的长度:");
          scanf("%d",&length);
      }
      printf("现在要输入各结点的值.\n");
      for(i=1;i<=length;i++)
      {
            p=(QLink *)malloc(sizeof(QLink));
            scanf("%d",&p->data);
            p->next=NULL;
            if(i==1) head=p;
            else
            {
                 q=head;
                 while(q->next!=NULL) q=q->next;
                 q->next=p;
            }
      }
      printf("链表已建立,现在要将它输出.\n");
      p=head;
      for(i=1;i<=length;i++)
      {
            printf("%d  ",p->data);
            p=p->next;
      }
      printf("\n");
      printf("现在要将其置逆.\n");
      printf("程序置逆中……\n");
      printf("置逆成功.现在要将新的链表输出.\n"); 
      p=head;
      while(head->next!=NULL)
      {
           q=p;
           p=head->next;
           head->next=p->next;
           p->next=q;
      }
      head=p;
      p=head;
      for(i=1;i<=length;i++)
      {
            printf("%d  ",p->data);
            p=p->next;
      }
      system("pause"); 
}[/quote]
你的程序逆置后的队列多了一个头结点
如果是带头节点的队列要注意修改这里
这程序算法比我的简明
但是这程序的写法有一些不严密

4 楼

void LinList<T>::change()
{
    ListNode<T>*p,*q;
    p=head->next;
    head->next=NULL;
    while(p!=NULL)
    {        
        q=p;
        p=p->next;        
        q->next=head->next;
        head->next=q;    
    }
}

5 楼

编译出错要加头文件
#include<malloc.h>
#include<windows.h>

6 楼

typedef struct QLink
{
         int data;
         struct QLink *next;
}* QLink;

我在用ANSI C来描述数据结构都定义成指针形式,这样调用函数的时候就全部是址传递了。
老严书上全部用的引用传递,那是C++的东西

7 楼


struct Node* reverse(struct Node *head)
{//倒转链表
    struct Node *p1,*p2,*q;
    p2=head;
    p1=NULL;
    while(p2!=NULL)
    {
        q=p2->next;
        p2->next=p1;
        p1=p2;
        p2=q;
    }
    head=p1;
    return head;
}

8 楼

void ReverseList(List L){
  ListItem tmp;
  int i;
  for (i=0;i<L->n/2;i++) {
    tmp=L->table[i];
    L->table[i]=L->table[L->n-1-i];
    L->table[L->n-1-i]=tmp;
  }
}

9 楼

这里我做了简单总结,希望可以帮助你。
http://hi.baidu.com/fandywang%5Fjlu/blog/item/a56594c367f85254b219a87a.html

我来回复

您尚未登录,请登录后再回复。点此登录或注册