鱼C论坛

 找回密码
 立即注册
查看: 2516|回复: 7

求单链表倒数第k个结点

[复制链接]
发表于 2014-4-26 13:51:56 | 显示全部楼层 |阅读模式
20鱼币
输入一个字符序列,生成带头结点的单链表,输入0表示结束,例如输入1230,则生成的单链表为->|  | -> | 1 | -> | 2 | -> | 3 |。输出该链表中倒数第k个结点的值。
例如,输入:12548632102
输出:2
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-26 13:51:57 | 显示全部楼层
  1. /*
  2. 输入一个字符序列,生成带头结点的单链表,输入0表示结束,例如输入1230,则生成的单链表为->|  | -> | 1 | -> | 2 | -> | 3 |。输出该链表中倒数第k个结点的值。
  3. 例如,输入:12548632102
  4. 输出:2
  5. */

  6. #include <stdio.h>
  7. #include <stdlib.h>

  8. struct Node {
  9.         char data;
  10.         struct Node* next;
  11. };
  12. struct Node* create_node( char d, struct Node* n );

  13. struct List {
  14.         struct Node* pHead;
  15.         struct Node* pTail;
  16.         int to_be_found_in_reverse;
  17. };
  18. void init_and_input( struct List* plist );
  19. void output_and_destroy( struct List* pList );
  20. void init( struct List* plist );
  21. void destroy( struct List* plist );
  22. void show( const struct List* pList );

  23. int main() {
  24.         struct List list;
  25.         init_and_input( &list );
  26.         //show( &list );
  27.         output_and_destroy( &list );
  28. }

  29. void init_and_input( struct List* plist ) {
  30.         char tmp;
  31.         init( plist );
  32.         while( (tmp = getchar()) != '0' ) {
  33.                 plist->pTail->next = create_node( tmp, NULL );
  34.                 plist->pTail = plist->pTail->next;
  35.         }
  36.         scanf("%d",&plist->to_be_found_in_reverse);
  37. }

  38. struct Node* create_node( char d, struct Node* n ) {
  39.         struct Node* result;
  40.         result = (struct Node*)malloc( sizeof( struct Node ) );
  41.         result->data = d;
  42.         result->next = n;
  43.         return result;
  44. }

  45. void show( const struct List* pList ) {
  46.         const struct Node* p;
  47.         for( p = pList->pHead->next; p; p=p->next ) {
  48.                 printf("%c",p->data);
  49.         }
  50.         printf("\n");
  51. }

  52. void output_and_destroy( struct List* pList ) {
  53.         const struct Node* p;
  54.         int total_step = 0;
  55.         int step;//正数的步数
  56.         int i;
  57.         for( p = pList->pHead->next; p; p=p->next ) {
  58.                 ++total_step;
  59.         }
  60.         step = total_step - pList->to_be_found_in_reverse;
  61.         for( p = pList->pHead->next,i=0; i<step; p=p->next,++i );
  62.         printf("%c\n",p->data);
  63.         destroy( pList );
  64. }

  65. void init( struct List* plist ) {
  66.         plist->pHead = create_node( 0, NULL );
  67.         plist->pTail = plist->pHead;
  68. }

  69. void destroy( struct List* plist ) {
  70.         struct List* tmp;
  71.         while( plist->pHead ) {
  72.                 tmp = plist->pHead;
  73.                 plist->pHead = plist->pHead->next;
  74.                 free( tmp );
  75.         }
  76. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-26 15:08:08 | 显示全部楼层
又是个要交作业的,
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-27 08:05:10 | 显示全部楼层
给你提供个思路,用两个指针。
倒数第N个,那么他们指针的间隔就是N,当某一个先遍历完的时候,在后面的那个再往下走一步就是指向倒数第N个了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-27 20:55:01 | 显示全部楼层
这个,小甲鱼的数据结构与算法里面应该有啊!:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-28 21:29:41 | 显示全部楼层
李文浩。。原来你也是大机电的。。。快被这个作业搞疯了:dizzy:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-11 10:26:14 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-5-12 23:52:58 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

struct node
{
        char ch;
        struct node* next;
};
struct list
{
        struct node* head_node;
        int len;


};
struct node* malloc_node(char ch)
{
        struct node* node = malloc(sizeof(struct node));
        node->ch = ch;
        node->next = NULL;
       
        return node;

}
struct list* malloc_list(void )
{
        struct list* l = malloc(sizeof(struct list));
        l->head_node = malloc(sizeof(struct node));
        l->head_node->next = NULL;
        l->len = 0;
        return l;
}
void push_front(struct list* l,char ch)
{
        struct node* node = malloc_node(ch);
        if(l->len==0)
        {
                l->head_node = node;
                l->len++;
                return ;
        }
        node->next = l->head_node->next;
        l->head_node->next = node;
        l->len++;

}
char search(struct list* l ,int k)
{
        struct node* cur = NULL;
        int n = 0;
        if(l->len<k)
        {
                printf("NULL");
                return '\0';
        }
        else
        {
                n = l->len-k+1;
                cur = l->head_node->next;
                while(--n)
                {
                        cur = cur->next;
                }
                return cur->ch;

        }

}
int main()
{
        struct list* l = malloc_list();
        char ch;
        printf("Please input the character: ");
        while(1)
        {
                ch = getchar();
                if(ch == '0')
                        break;
                push_front(l,ch);
        }
        printf("The third character is :");
        ch = search(l,3);        注释倒数第三个字符。
        putchar(ch);
        putchar('\n');
        return 0;


}
好像输出有点出入,自己试着找下原因吧,找到顺便给我说下。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 14:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表