| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 887 人关注过本帖, 1 人收藏
标题:小鱼儿_单链表倒置
只看楼主 加入收藏
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
结帖率:95.74%
收藏(1)
 问题点数:0 回复次数:8 
小鱼儿_单链表倒置
数据结构自己自学了一些。
这期才开的课。

老师布置的作业。。。

简单写了一下
程序代码:
// Note:Your choice is C++ IDE
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define DateType int

typedef struct tagListNode
{
    DateType date;
    struct tagListNode *next;
}ListNode;

typedef struct tagListInfo
{
    ListNode* head;
    ListNode* tail;
    int num;   
}ListInfo;

typedef struct tagList
{
    void *lpr; //私有数据不给用户操作
}List;

int CreateList(List &l)
{
    ListInfo * li = NULL;
    l.lpr = (ListInfo*)malloc(sizeof(ListInfo));
    if(l.lpr == NULL)
    {
        cout<<"非法数据"<<endl;
        return 0;
    }
    li = (ListInfo*)l.lpr;
    li->head = NULL;
    li->tail = NULL;
    li->num = 0;
    return 1;
}

int ListAdd(List &l,DateType date)
{
    ListInfo* li = NULL;
    ListNode* CurPtr = NULL;
    li = (ListInfo*)l.lpr;
    CurPtr = (ListNode*)malloc(sizeof(ListInfo));
    if(NULL == CurPtr)
    {
        cout<<"内存申请失败"<<endl;
        return 0;
    }
    CurPtr->date = date;
    CurPtr->next = NULL;
   
    if(NULL == li->head)
    {
        li->head = CurPtr;
        li->tail = CurPtr;
        li->num++;
    }
    else
    {
        li->tail->next = CurPtr;
        li->tail = CurPtr;
        li->num++;
    }
    return 1;
}

void ListShow(List &l)
{
    ListInfo* li = NULL;
    li = (ListInfo*)l.lpr;
    ListNode* CurPtr = NULL;
   
    CurPtr = li->head;
    while(CurPtr)
    {
        cout<<(CurPtr->date)<<"\t";
        CurPtr = CurPtr->next;
    }
   
}

//主要功能函数:把一个链表的重置(这里是调用指针的形式进行)
//主要是用到3个指针 :: p 代表prePtr c 代表 CurPtr t 代表 tempHead
// 0 1 2 3 4 5 6 7 8 9 10
// p c t

// 0 1 2 3 4 5 6 7 8 9 10
//   p c t
//这样3个指针移动修改指针的指向就可以了。
//具体细节看代码
void ListRever(List &l)
{
    ListInfo* li = NULL;
    ListNode* temp = NULL;
    ListNode* CurPtr = NULL;
   
    //放原来的头尾结点的位置
    ListNode* tempHead = NULL;
    ListNode* tempTail = NULL;
   
    li = (ListInfo*)l.lpr;
    if(li->head == NULL)
    {
        puts("头不能为空");
        return;
    }
   
    tempHead = li->head->next;
    CurPtr = tempHead;
    tempTail = li->head;
    ListNode* pRePtr = li->head;
   
    while(tempHead)
    {
        tempHead = tempHead->next;
        CurPtr->next = pRePtr;
        temp = CurPtr;
        CurPtr =tempHead;
        pRePtr = temp;
    }
   
    tempTail->next = NULL; //注意一定要 不然出现问题
   
    li->head = pRePtr; //这里pRePtr 移到最后是运行到原来链表的尾部
    li->tail = tempTail;
   
   
}
int main()
{
    int date[100] = {0};
    List l;
    CreateList(l);
    for(int i=0;i<100;i++)
    {
        ListAdd(l,i);
    }
   
    ListShow(l);
   
    puts("\n就要进行重置了");
   
    ListRever(l);
    ListShow(l);
    return 0;
}


 
搜索更多相关主题的帖子: 数据 自学 include 小鱼儿 
2012-03-07 21:41
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
逆置的最优雅的做法 难道不是递归。。


你这写的个什么玩意。 太烂。
2012-03-08 13:22
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用Devil_W在2012-3-8 13:22:13的发言:

逆置的最优雅的做法 难道不是递归。。
 
 
你这写的个什么玩意。 太烂。
老师就要链表做。



[ 本帖最后由 小鱼儿c 于 2012-3-8 17:12 编辑 ]

用心做一件事情就这么简单
2012-03-08 16:14
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用小鱼儿c在2012-3-8 16:14:20的发言:

你脑袋卡了吧,
老师就是链表做。

记得不要老子给你脸不要脸 OK。
今天hellovfp 回来了,不跟你吵。。



当我说你写的烂得时候,你真心应该去看看我说你写的烂旁边的那几句话。

一般那几句话就是你可以成长的空间。
2012-03-08 16:25
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用Devil_W在2012-3-8 16:25:55的发言:

 
 
 
当我说你写的烂得时候,你真心应该去看看我说你写的烂旁边的那几句话。
 
一般那几句话就是你可以成长的空间。
主要是你没有看明白我为什么写吗??
老师作业题:链表逆置。。

呵呵,貌似明白你的意思了。
但递归的话,是不是效率太低了啊。。

用栈呢!!!!

谢谢了,开始没有明白你的意思。。
我试试看,能否实现了。。。。

用心做一件事情就这么简单
2012-03-08 16:58
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
但用这种置换没有什么不好的啊。
给一个不好理由啊。。

用心做一件事情就这么简单
2012-03-08 16:59
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
其实只要把元素再从新插入一边就行了 头插法

比如原来是      1 2 3 4 ... n

第1个元素头插   1 2 3 4 ... n

第2个元素头插   2 1 3 4 ... n

...

第n个元素头插   n n-1   ... 1

                                         
===========深入<----------------->浅出============
2012-03-08 17:04
小鱼儿c
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:852
专家分:1317
注 册:2011-4-1
收藏
得分:0 
以下是引用laoyang103在2012-3-8 17:04:15的发言:

其实只要把元素再从新插入一边就行了 头插法

比如原来是      1 2 3 4 ... n

第1个元素头插   1 2 3 4 ... n

第2个元素头插   2 1 3 4 ... n

...

第n个元素头插   n n-1   ... 1
谢谢,老杨

用心做一件事情就这么简单
2012-03-08 23:45
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用小鱼儿c在2012-3-8 16:58:35的发言:

主要是你没有看明白我为什么写吗??
老师作业题:链表逆置。。

呵呵,貌似明白你的意思了。
但递归的话,是不是效率太低了啊。。

用栈呢!!!!

谢谢了,开始没有明白你的意思。。
我试试看,能否实现了。。。。



这个递归的效率 是O(n)

我不相信有比O(n)更快的逆置
2012-03-09 12:56
快速回复:小鱼儿_单链表倒置
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025957 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved