一套编程题 编程题 41-50

本文详细介绍了如何使用标准C语言实现双向循环链表,包括查找特定键值并删除节点的方法,以及一个仅用一个for循环的图案打印示例。此外,还展示了整数转换为字符串、单链表与双链表的基本操作,如插入、删除和排序。
摘要由CSDN通过智能技术生成
41.请用标准C语言实现一个双向循环链表的查找与删除。
typedef struct doublecyclelink{
int key;
struct doublecyclelink *prev;
struct doublecyclelink *next;
}DoubleCycleLinkT;
DoubleCycleLinkT *findKey(DoubleCycleLinkT *link,int key);
遍历整个双向循环链表,将第一个与key值相同的结点移出链表,并返回。
若没有找到则返回NULL。
    DoubleCycleLinkT *findKey(DoubleCycleLinkT *link,int key)
    {
        DoubleCycleLinkT *p;
        p=link->next;
        while (p->next!=link) // 链表结尾
        {
            if (p->key==key) // 查找到key值相同,删除该节点,并返回
            {
                p->prev->next=p->next;
                p->next->prev=p->prev;
                free(p);
                return link;
            }
            else 
              p=p->next; // 否则查找下一节点
         }
        if (p->next == link) 
return NULL; //没找到,返回NULL 
    }

42.打印如下图案,共19行,只能有一个for循环(题目已经提供)
         *
        	 ***
       	     *****
       	    *******
             *********
             ***********
             *************
             ***************
            *****************
            *******************
            *****************
            ***************
            *************
            ***********
            *********
            *******
            *****
             ***
             *
    #include "stdio.h"
    void main()
    {
        for(int i=0;i<19;i++)
        {
            int j=0;
            while (j<19) 
            {
                if (i<=9) 
               {
                    if (j<=9) 
                    {
                        if (i+j>=9) 
                            printf("*");
                        else 
                            printf(" ");
                    }
                    else if (j-i<=9) 
                        printf("*");
                    else 
                        printf(" ");
                }
                else
                {
                     if (j<=9)
                    {
                        if (i-j<=9) 
                            printf("*");
                        else
                            printf(" ");
                    }
                    else if (j+i<=27) 
                        printf("*");
                    else 
                        printf(" ");
                }
                j++;
            }
            printf("\n");
        }
    }


43.编程:  将整数转换成字符串:void itoa(int,char);
例如itoa(-123,s[])则s=“-123”;
 	char* itoa(int value, char* string)
    {
        char tmp[33];
        char* tp = tmp;
        int i;
        unsigned v;
        char* sp;
        // 将值转为正值
        if (value < 0)
            v = -value;
        else
            v = (unsigned)value;
        // 将数转换为字符放在数组tmp中
        while (v)
        {
            i = v % 10;
            v = v / 10;
            *tp++ = i+'0';
        }
        // 将tmp里的字符填入string指针里,并加上负号(如果有) 
        sp = string;
        if (value < 0)
        *sp++ = '-';
        while (tp > tmp)
        *sp++ = *--tp;
        *sp = 0;
        return string;
    }

44.完成下列程序
*
*.*.
*..*..*..
*...*...*...*...
*....*....*....*....*....
*.....*.....*.....*.....*.....*.....
*......*......*......*......*......*......*......
*.......*.......*.......*.......*.......*.......*.......*.......
    #define N 8
    int main()
    {
        int i;
        int j;
        int k;
        for(i=0;i<N;I++)
        {
            for(j=0;j<I+1;J++)
            {
                printf("*");
                for(k=0;k<I;K++)
                    printf(".");
            }
            printf("\n");
        }
        return 0;
    }

45. 实现一个整型链表,支持插入,删除操作(有特殊要求,都是在指定节点后进行操作),并写一个对
链表数据进行降序排序的方法。

// 单链表结构体为
typedef struct LNode 
{
    int data;
    struct LNode *next;
}LNode, *pLinkList;

// 单链表类
class LinkList
{
private:
    pLinkList m_pList;
    int m_listLength;
public:
    LinkList();
    ~LinkList();
    bool InsertAfter(int afternode, int data);//插入
    bool RemoveAfter(int removenode);//删除
    void sort();//排序
};

实现方法
//insert a node after a specified node
bool LinkList::InsertAfter(int afternode, int data)
{
    LNode *pTemp = m_pList;
    int curPos = -1;
    if (afternode > m_listLength ) // 插入点超过总长度
    {
        return false;
    }
    while (pTemp != NULL) // 找到指定的节点
    {
        curPos++;
        if (curPos == afternode) 
            break;
        pTemp = pTemp->next;
    }
    if (curPos != afternode) // 节点未寻到,错误退出
   {
        return false;
    }
    LNode *newNode = new LNode; // 将新节点插入指定节点后
    newNode->data = data;
    newNode->next = pTemp->next;
    pTemp->next = newNode;
    m_listLength++;
    return true;
}

//remove the node after a specified node
bool LinkList::RemoveAfter(int removenode) 
{
    LNode *pTemp = m_pList;
    int curPos=-1;
    if (removenode > m_listLength) // 删除点超过总长度
    {
        return false;
    }

    // 找到指定的节点后一个节点,因为删除的是后一个节点
    while (pTemp != NULL) 
    {
        curPos++;
        if (curPos == removenode+1) 
            break;
        pTemp = pTemp->next;
    }
    if (curPos != removenode) // 节点未寻到,错误退出
    {
        return false;
    }
    LNode *pDel = NULL; // 删除节点
    pDel = pTemp->next;
    pTemp->next = pDel->next;
    delete pDel;
    m_listLength--;
    return true;
}

//sort the linked list to descending order.
void LinkList::sort()
{
    if (m_listLength<=1)
    {
        return;
    }
    LNode *pTemp = m_pList;
    int temp;
    // 选择法排序
    for(int i=0;i<M_LISTLENGTH-1;I++)
    for(int j=i+1;j<M_LISTLENGTH;J++)
    if (pTemp[i].data<PTEMP[J].DATA)
    {
        temp=pTemp[i].data;
        pTemp[i].data=pTemp[j].data;
        pTemp[j].data=temp;
    }
} 

46. 编程实现单链表的插入
Node* InsertNode(Node *Head, int num)
{
    		Node *newNode = new Node;
		newNode->data = num;
		if(!Head)//此时为空链表
		{
			newNode->next = NULL;
			return newNode;
		}
		Node *p = Head;
		Node *q = NULL;//q指向p结点之前的结点
		while(p)//此时寻找位置
		{
			if(p->data < num)
			{
            		q = p;
				p = p->next;
			}
			else//此时找到了位置
				break;
		}
		if(p == Head)//插入到头结点之前
		{
			newNode->next = Head;
			Head = newNode;
		}
		else if(!p)//插入到尾结点之后,此时q指向尾结点
		{
			q->next = newNode;
			newNode->next = NULL;
		}
		else//插入到p结点和q结点之间
		{
			newNode->next = q->next;
			q->next = newNode;
		}
		return Head;
}

47. 编程实现双链表删除结点(注意它和单链表删除结点的情况有所不同)
Node* DoubleLink_DelNode(Node *Head, int num)
{
		Node *p = Head;
		if(!p)
			return NULL;
		while(p)
		{
			if(num != p->data)
		   		p = p->next;
			else
				break;
		}
		if(!p)//没有找到要删除的结点
			return NULL;
		else
		{
			if(p == Head)//此时删除的是头结点
			{
				Head = Head->next;
		   		delete p;
			}
			else if(p->next)//此时删除的是中间结点
			{
				p->prev->next = p->next;
				p->next->prev = p->prev;
				delete p;
			}
			else//删除的是尾结点
			{
				p->prev->next = NULL;
				delete p;
			}
		}
    	     return Head;
}

48. 编程实现双链表的插入
Node* DoubleLink_InsertNode(Node *Head, int num)
{
		Node *newNode = new Node;//初始化产生一个新结点
		newNode->data = num;
		newNode->prev = NULL;
		newNode->next = NULL;
		Node *p = Head;
		Node *q = NULL;
		while(p)
		{
			if(p->data < num)
			{
				q = p;
				p = p->next;
			}
			else
				break;
		}
		if(p == Head)//此时是在头结点之前进行插入
		{
			newNode->next = p;
			p->prev = newNode;
			Head = newNode;
		}
		else if(!p)//在尾结点之后进行插入
		{
			q->next = newNode;
			newNode->prev = q;
		}
		else//在中间进行插入
		{
			p->prev->next = newNode;
			newNode->prev = p->prev;
			newNode->next = p;
			p->prev = newNode;
		}
   		 return Head;
}

49. 如何证明一个表是循环链表
link * p,*q; 
p=head; 
q=p->next; 
while(q&&q->next&&p!=q)  //q or q->next ==NULL时无环, q==q时有环 
{
p=p->next; 
 		q=q->next->next; 
}
if(p==q) 
      cout<<"have ring"; 
else 
     cout<<"no ring";

50. 实现队列的出队与入队
//数据入队列
Node *EnQueue(Node *head, Node **tail, int data)
{
		//创建一个新结点
		Node *p = new Node;
		p->data = data;
		p->next = NULL;
		if(head == NULL)//此时为空队列
		{
        		head = p;
			*tail = p;
		}
		else
		{
			(*tail)->next = p;
			*tail = p;
		}
		return head;
}

//删除头结点
Node* DeQueue(Node *head)
{
    		if(!head)//头结点为空
			return NULL;
		else
		{
			Node *p = head;
			head = head->next;
			delete p;
		}
		return head;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值