再来!看去年的题,我搞得晕,想得太复杂了!看结果。
// 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]