前言
此题考察的主要是链表的定义,创建(头插法或尾插法),遍历,删除等内容
一、题目
二、代码步骤
1.思路
首先要将数据输入并根据下一节点地址进行排序,然后将节点用链表连接,接着双层循环寻找重复的数字,并进行删除,同时将删除的数据加入到重复链表上面。
2.代码如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct LNode{
int idex;//该节点的地址
int data;//该节点的数据
int nextidex;//下个节点的地址
struct LNode* next;
};
//初始化
LNode *Init(){
LNode *head = (LNode *)malloc(sizeof(LNode));
head->next = NULL;
return head;
}
//寻找当前节点q的直接前驱
LNode *Search(LNode *head,LNode *q)
{
LNode *p = head->next;
while(p->next != q)
{
p = p->next;
}
return p;
}
int main()
{
int startidex;//起始地址
int n;//数量
int i=0,j=0,length;
LNode List[1000];
LNode temp,*head,*q,*p,*r,*t,*st;
head = Init();//初始化
st = Init();//初始化
q=head;
scanf("%d %d",&startidex,&n);//输入起始地址和数量
for(i=0;i<n;i++)
{
scanf("%d %d %d",&List[i].idex,&List[i].data,&List[i].nextidex);
}
//按照输入前后地址对节点排序
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(List[j].idex == startidex){
temp = List[i];
List[i] = List[j];
List[j] = temp;
startidex = List[i].nextidex;
break;
}
}
}
//用链表将这些节点链接
for(i=0;i<n;i++){
p = (LNode *)malloc(sizeof(LNode));
p = &List[i];
p->next = NULL;
q->next = p;
q = q->next ;
}
q = head;
p = q->next;
t=st;
while(p){
q=p->next;
while(q){
if(q->data==p->data||q->data==-(p->data)){
if(q->next == NULL){//删去重复节点
LNode *s = Search(head,q);
s->nextidex = -1;
s->next = NULL;
}
else{
LNode *s = Search(head,q);
s->nextidex = q->next->idex;
s->next = q->next;
}
r = q;//尾插法创建重复链表
t->next = r;
t = t->next;
}
q = q->next;
}
p = p->next;
}
q = head;
p = q->next;
printf("----------\n");
//输出删去重复节点的链表
while(p){
printf("%d %d %d\n",p->idex,p->data,p->nextidex);
p=p->next;
}
printf("----------\n");
t=st;
p=t->next;
//输出重复链表
while(p){
q = p->next;
if(q == NULL){//修改下一节点地址
p->nextidex = -1;
}
else{
p->nextidex = q->idex;
}
printf("%d %d %d\n",p->idex,p->data,p->nextidex);
p=p->next;
}
}
3.运行结果
总结
虽然题目不难,但还是花了不少时间(主要是自己太菜),本题主要参考(数据结构C语言)链表去重_链表去重c语言_师傅ao的博客-CSDN博客