一道TX的笔试题,删除双向链表的一个指定节点

// doubleLink.cpp : 定义控制台应用程序的入口点。
//

/*
给定一个数,从这个双向链表中删除数值为这个数的节点。如果有多个这样的节点,只要删除任意一个即可。
请给出函数原型和代码实现。
*/
/*
带有头结点的双向链表,我删除的是第一个顺序遍历,发现的节点
我实在vs2008下编写的。
*/
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
struct node {
    int value;
    struct node *priv;
    struct node *next;
};
/*建立一个双向链表*/
struct node* create_double_link();
/*删除指定值的双向链表*/
struct node* delete_double_link(struct node* head,int value);
void print_double_link(struct node*  head);

struct node* create_double_link()
{

    struct node* head=NULL;
    struct node* pcurrent=NULL;
    struct node*ptemp=NULL;

    int num=0,total=0;
    do
    {
        printf("please input the number: \n");
        scanf("%d",&total);
        if( total == 0 )
            printf("sorry,the number is error!\n");
        else
            printf("\n");

    }while( total == 0 );

    while(num<total)
    {
        num=num+1;

        pcurrent=(struct node*)malloc(sizeof(struct node));
        if( pcurrent==NULL )
        {
            printf("malloc error,please check it!\n");
            break;
        }
        else
        {
            pcurrent->value=num;
        }

        if( num == 1)
        {
            head=pcurrent;
            pcurrent->priv=NULL;
        }
        else
        {
            ptemp->next=pcurrent;
            pcurrent->priv=ptemp;
        }
        ptemp=pcurrent;
    }
    ptemp->next=NULL;
    return (head);
}

struct node* delete_double_link(struct node* head,int value)
{
    struct node* pcurrent=NULL;
    pcurrent=head;

    if( head==NULL )
    {
        printf("error:please check the data!\n");
        return(NULL);
    }
    else
    {
        while( (value!=pcurrent->value)&&(pcurrent->next!=NULL) )
            pcurrent=pcurrent->next;

        if(value==pcurrent->value)//find it
        {
            if( pcurrent==head )// is head node
            {
                pcurrent->next->priv=NULL;
                head=pcurrent->next;
            }
            else if(pcurrent->next==NULL)//wear
            {
                pcurrent->priv->next=NULL;
            }
            else
            {
                pcurrent->priv->next=pcurrent->next;
                pcurrent->next->priv=pcurrent->priv;
            }

            free(pcurrent);

            printf("the num have been deletea is: %d\n",value);
        }
        else
        {
            printf("can not find the num: %d\n",value);
        }
    }
    return(head);
}
void print_double_link(struct node*  head)
{
    struct node*  ptemp;
    if( head == NULL)
    {
        printf("error:have no data!\n");
        return;
    }
    ptemp=head;
    while(ptemp)
    {
        printf("num: %d\n",ptemp->value);
        ptemp=ptemp->next;
    }
    return;
}
int _tmain(int argc, _TCHAR* argv[])
{

    struct node* head,ptemp;
    int num=0;

    head=create_double_link();
    print_double_link(head);    

    printf("please input the delete num:\n");
    scanf("%d",&num);
    head=delete_double_link(head, num);
    print_double_link(head);
    Sleep(10000);
	return 0;
}

时间: 2024-11-07 20:50:37

一道TX的笔试题,删除双向链表的一个指定节点的相关文章

一道Android OpenGL笔试题

一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:[email protected] 更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com 题目 设计一个Android平台的Gallery组件,要求Gallery中每个item内的图片显示达成有效显示的最大精度,并保证Gallery在滚屏时能够全60FPS帧率地及时显示出加载的图片.请详细说明实现架构.关键技术点及APIs. 约束条件:GPU空间传输通道带宽较小,对于4

删除双向链表最后一个元素

初始化双向链表后使用尾插法插入元素,然后对插入的元素进行删除,发现不能删除链表最后一个元素... 控制台没反应,删除最后一个元素失败了,然后思考了几分钟,发现问题所在... 控制台正常输出,问题解决了... 原文地址:https://www.cnblogs.com/YLJ666/p/12252829.html

Linux fork函数详细图解-同时分析一道腾讯笔试题

原创blog,转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 注意,子进程是父进程的副本,拷贝父进程的数据空间,堆栈等资源.父子进程不共享上述资源. 每执行一次fork(

(笔试题)删除K位数字

题目: 现有一个 n 位数,你需要删除其中的 k 位,请问如何删除才能使得剩下的数最大? 比如当数为 2319274, k=1 时,删去 2 变成 319274 后是可能的最大值. 思路: 1.贪心算法 每次从高位向低位数,删除高位数字比低位数字小的那位数字.如2319274 第一次2<3,删除2,得到319274 第二次3>1,略过,1<9,删除1,得到39274 第三次3<9,删除3,得到9274 ...... // greedy method string deleteKBi

一道有意思的笔试题引发的对于new操作符的思考

楼主比较喜欢看一些很短但很有意思的题目,无意间又瞥到了一题,大家不妨可以一试.(原题链接猛戳这里) function Fn1() { this.name = 'peter'; return { name: 'jack' }; } function Fn2() { this.name = 'peter'; return 'jack'; } var obj1 = new Fn1(); var obj2 = new Fn2(); console.log(obj1.name, obj2.name); 或

阿里校招:前端线上笔试题--页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动

题目: 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动: <html> <head> <style type="text/css"> .item{ width:20px; height:20px; border-radius:10px; background: blue; position: absolute; }/*border-radius圆角半径*/ #point{ left:95px; top:295px;

经典笔试题:简单实现一个死锁的例子

package com.gaopeng.multithread; /** * 简单实现一个死锁例子 * * @author gaopeng * */ public class DeadLockTest { // 创建资源 private static Object resourceA = new Object(); private static Object resourceB = new Object(); public static void main(String[] args) { //

送上今年微软的一道笔试题

这里送上一道微软的笔试题,具体题目如下: Time Limit: 10000msCase Time Limit: 1000msMemory Limit: 256MB Description Consider a string set that each of them consists of {0, 1} only. All strings in the set have the same number of 0s and 1s. Write a program to find and outp

阿里2道前端笔试题+堆糖2道前端笔试题

阿里前端笔试题 1.一个表格HTML代码如下 <table id="table1"> <tbody> <tr><td>1</td><td><button>Delete</button></td></tr> <tr><td>2</td><td><button>Delete</button></