考计算机看了题目就忘,考计算机专业必看-部分历年考题勘误!!_第2页_吉林大学_考研论坛(kaoyan.com)...

再来!看去年的题,我搞得晕,想得太复杂了!看结果。

// 2004_5.cpp : Defines the entry point for the console application.

/*=============================================================================*/

/*程序名称:2004_5.c                                                           */

/*程序目的:删除整数单链表中重复的节点                                      */

/*Writen by IdeaWings                                                                           */

/*=============================================================================*/

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

//#define  MAXLEN 5000

#define  true  1

#define  false 0

struct Node

{

int data ;

struct Node * next ;

} ;

//typedef  int   bool;

typedef struct Node ListNode ;

typedef struct Node* pLinkList ;

typedef pLinkList pListNode ;

/*------------------------------------------------------------------------------*/

/* 以用户输入建立单链表                                                                     */

/*------------------------------------------------------------------------------*/

bool CreateLinkList(pLinkList &head,int Length)

{

bool bResult = true ;

pListNode newNode ;

pListNode p;

int Value ;

printf("请输入建立链表的各结点的值:\n");

scanf("%d",&Value);

head = (pLinkList)malloc(sizeof(ListNode));

if (head)

{

head->data = Value ;

head->next = NULL;

p = head ;

for ( int i=0;i

{

scanf("%d",&Value);

newNode = (pLinkList)malloc(sizeof(ListNode));

if (newNode)

{

newNode->data = Value ;

newNode->next = NULL;

p->next = newNode ;

p = p->next;

}

else

{

bResult = false ;

break;

}

}

}

else

bResult = false ;

if (!bResult)

printf("内存分配失败!\n");

return bResult ;

}

/*------------------------------------------------------------------------------*/

/* Clone单链表                                                                                     */

/*------------------------------------------------------------------------------*/

bool CloneLinkList(pLinkList &head,pLinkList &NewList)

{

pListNode p,q ;

bool bResult = true ;

if (!head)

NewList = head ;

else

{

p = (pLinkList)malloc(sizeof(ListNode));

if (p)

{

NewList = p ;

p->data = head->data ;

p->next = NULL ;

q = head->next ;

while (q)

{

p->next = (pLinkList)malloc(sizeof(ListNode));

if (p->next)

{

p->next->data = q->data ;

p = p->next ;

p->next = NULL ;

}

else

{

bResult = false ;

break ;

}

q = q->next ;

}

}

else

bResult = false ;

}

if (!bResult)

printf("内存分配失败!\n");

return bResult ;

}

/*------------------------------------------------------------------------------*/

/* 删除单链表                                                                                     */

/*------------------------------------------------------------------------------*/

void DeleteList(pLinkList &p)

{

pLinkList q ;

while(p)

{

q = p ;

p = p->next ;

free(q);

}

}

/*------------------------------------------------------------------------------*/

/* 输出单链表                                                                                     */

/*------------------------------------------------------------------------------*/

void PrintList(pLinkList &pL)

{

pListNode p ;

p = pL ;

while(p)

{

printf("%2d-->",p->data);

p = p->next ;

}

printf("NULL\n");

}

/*------------------------------------------------------------------------------*/

/* 递归删除单链表中的重复结点                                                         */

/*------------------------------------------------------------------------------*/

pLinkList MyDG_DelSameNode(pLinkList head,int data)

{

if (!head->next) return head ;

MyDG_DelSameNode(MyDG_DelSameNode(head->next,data),head->next->data);

pLinkList p = head->next;

if (data==p->data)

{

head->next = p->next ;

free(p);

}

return head ;

}

/*------------------------------------------------------------------------------*/

/* 递归删除单链表中的重复结点2                                                         */

/*------------------------------------------------------------------------------*/

pLinkList MyDG2_DelSameNode(pLinkList head,int data,pLinkList pL)

{

if (!head->next) return head ;

pLinkList p ;

p = MyDG2_DelSameNode(head->next,data,pL);

if ( (p == pL->next) && p )

MyDG2_DelSameNode( p,p->data,p);

p = head->next;

if (data==p->data)

{

head->next = p->next ;

free(p);

}

return head ;

}

/*------------------------------------------------------------------------------*/

/* 递归地删除链表中的重复节点                                            */

/*------------------------------------------------------------------------------*/

pLinkList JLU_delSame(pLinkList head)

{

pLinkList pointer,temp = head;                /* 函数中需要用到的临时变量 */

if (head->next == NULL)                        /* 若head为空则直接返回 */

return head;

head->next = JLU_delSame(head->next);        /* 递归地删除重复节点 */

pointer = head->next;

while (pointer != NULL)

{

if (head->data == pointer->data)        /* 删除重复节点 */

{

temp->next = pointer->next;

free(pointer);                        /* 释放被删除节点所占用的空间 */

pointer = temp->next;

}

else

{

pointer = pointer->next;        /* 如果没有重复节点则指针后移 */

temp = temp->next;

}

}

return head;

}

/*------------------------------------------------------------------------------*/

/* 非递归地删除链表中的重复节点                                          */

/*------------------------------------------------------------------------------*/

pLinkList DelSameNode(pLinkList head)

{

pLinkList pre1,pre2,p;

int Value ;

pre1 = head;

while (pre1)

{

pre2 = pre1 ;

p = pre2->next ;

Value = pre2->data ;

while (p)

{

if (p->data==Value)

{

pre2->next = p->next ;

free(p);

p = pre2->next ;

}

else

{

pre2 = pre2->next ;

p = pre2->next ;

}

}

pre1 = pre1->next ;

}

return head ;

}

//-------------------------------------------------------

//-------------------------------------------------------

int main(int argc, char* argv[])

{

pLinkList pLa,pLb,pLc,pLd ;

int n ;

printf("请输入要建立的链表的长度:\n");

scanf("%d",&n);

if (CreateLinkList(pLa,n))

{

if (CloneLinkList(pLa,pLb))

if(CloneLinkList(pLa,pLc))

if(CloneLinkList(pLa,pLd))

{

printf("建立的链表如下:\n");

PrintList(pLa);

pLa = JLU_delSame(pLa);

printf("吉大算法删除后的结果:\n");

PrintList(pLa);

pLb = MyDG_DelSameNode(pLb,pLb->data);

printf("偶的递归算法删除后的结果:\n");

PrintList(pLb);

pLc = DelSameNode(pLc);

printf("偶的非递归算法删除后的结果:\n");

PrintList(pLc);

pLd = MyDG2_DelSameNode(pLd,pLb->data,pLd);

printf("偶的递归算法2删除后的结果:\n");

PrintList(pLd);

DeleteList(pLa);

DeleteList(pLb);

DeleteList(pLc);

DeleteList(pLd);

}

}

if (pLa) DeleteList(pLa);

if (pLb) DeleteList(pLb);

if (pLc) DeleteList(pLc);

if (pLd) DeleteList(pLd);

return 0;

}

原复制链表的时候,是1个元素的时候,嘿嘿,忘记给尾赋空值了,今天再加优化后的递归算法2!有时间的同学可上机跑,有问题共同探讨!!

[Last edited by iamfyx on 2004-12-10 at 02:22]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值