zbdn 2021-02-25 16:25 采纳率: 64.3%
浏览 114
已采纳

显示无法解析的外部命令,出什么问题了吗?应该怎么修改?

 将单向链表中关键字的值重复的结点删除,使得链表中各结点的值均不相同。

//12.5.cpp
#include "stdafx.h"
#include"LinkList.h"
#include<iostream>
#include<string>
using namespace std;


int main()
{ LinkNode<int>IntegerLList;
LinkNode<int>*head;
	const int N=100;
int a[N]={3,2,4,5,5,6,6,6};

IntegerLList.DeleteSame(head);
IntegerLList.Printf(head);
	return 0;
}

template<class T>
class LinkNode
{ 
	template<class T>
	friend class LinkList;
public:
	LinkNode()
	{ next=NULL;}
	void CreatNew(int n,int a[]);
	 void DeleteSame(LinkNode*head);
	 void Printf(LinkNode*head);
private:
	T data;
	LinkNode<T>*next;
	};
//LinkList.cpp
#include "StdAfx.h"
#include"LinkList.h"
template<class T>
void LinkNode<T>::CreatNew(int n,int a[])
{ LinkNode<T>*head;
  LinkNode<T>*tail;
  LinkNode<T>*p;
  head=NULL;
  for(int i=0;i<n;i++)
  { p=new LinkNode<int>;
    p->data=a[i];
	p->next=NULL;}
  if(!head)
  { head=tail=p;
  tail->next=NULL;}
  else
  { tail=tail->next=p;
  tail->next=NULL;}
  return head;}
//LinkList.h
template<class T>
void LinkNode<T>::DeleteSame(LinkNode*head)
{ LinkNode<T>*key;
  LinkNode<T>*p;
  LinkNode<T>*q;
  key=head;
  while(key)
  {  p=key;
  q=key->next;
  if(q!=NULL&&p!=NULL&&p->data==q->data)
  { 
	  p->next=q->next;
	  delete q;}
  key=key->next;}}

template<class T>
void LinkNode<T>::Printf(LinkNode<T>*head)
{ 
	LinkNode<T>*p=head;
	for(;p;p=p->next)
		cout<<"删除后的数表为:"<<p->data;}

  • 写回答

3条回答 默认 最新

  • 爱晚乏客游 2021-02-25 18:20
    关注

    给你写了一个简单的参考。如果链表都是整形的话,不要用模板和类,简单东西复杂化。

    //LinkList.h
    
    
    #include<iostream>
    typedef struct LinkNode
    {
    	int data;
    	struct LinkNode *next;
    } ;
    
    //函数声明:
    
    // 创建带头节点单链表
    LinkNode *CreatNew(int arr[], int len);
    
    //打印单链表
    void Printf(LinkNode*head);
    
    //删除重复项
    LinkNode *DeleteSame(LinkNode*head);
    //LinkList.cpp
    
    
    #include<iostream>
    #include"LinkList.h"
    using namespace std;
    // 尾插法创建单链表(带头节点)
    
    LinkNode *CreatNew(int arr[], int len)
    {
    	LinkNode *head = (LinkNode *)malloc(sizeof(LinkNode)); // 生成头节点
    	head->next = NULL;
    	LinkNode *end = head;  // 尾指针初始化
    
    	for (int i = 0; i < len; i++) {
    
    		LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode)); // 为每个数组元素建立一个节点
    		p->data = arr[i];
    		end->next = p;  // 将节点p插入到终端节点之后
    		end = p;
    	}
    
    	end->next = NULL;  // 单链表建立完毕,将终端节点的指针域置空
    
    	return head;
    }
    
    
    // 单链表打印
    void Printf(LinkNode *head)
    {
    	if (head == NULL) return;
    
    	LinkNode *p = head->next;
    	while (p != NULL) {
    		printf("%d  ", p->data);
    		p = p->next;
    	}
    }
    
    
    // 删除重复项(带头节点的单链表)
    LinkNode *DeleteSame(LinkNode *head)
    {
    	LinkNode *p, *q, *r, *temp;
    	LinkNode *s = head;
    	p = s->next;
    	int flag = 0; // flag用于标记在下一步遍历中,p后面的节点中 是否存在 与当前的p节点 相同的节点,若有,则flag为1;
    	while (p != NULL)    // p用于遍历链表,每次遍历过程中,用p节点和p后面的节点依次比较;
    	{
    		q = p;
    		while (q->next != NULL) // q遍历p后面的结点,并与p数值比较
    		{
    			if (q->next->data == p->data)
    			{
    				flag = 1; // flag为1,则在当前遍历结束后,删除当前的p节点;
    				r = q->next; // r保存需要删掉的结点
    				q->next = r->next;   // 需要删掉的结点的前后结点相接
    				free(r);
    			}
    			else
    				q = q->next;
    		}
    
    
    		if (flag == 0)
    		{
    			s = p;
    			p = p->next;
    		}
    		else
    		{
    			flag = 0; // 删除当前的p节点时,flag重新置为0;
    			temp = p;
    			p = p->next;
    			s->next = p;
    			free(temp);
    		}
    
    	}
    
    	return head;
    }
    
    //main.cpp
    
    #include"LinkList.h"
    #include<iostream>
    #include<string>
    using namespace std;
    
    
    int main()
    {
    
    	const int N = 100;
    	int a[] = { 3,2,4,5,5,6,6,6 };
    	LinkNode* head = CreatNew(a, 8);//需要创建一个带头节点的链表
    
    	DeleteSame(head);
    	Printf(head);
    	system("pause");
    	return 0;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?