数据结构删除单链表重复值!

来源:百度知道 编辑:UC知道 时间:2024/09/22 15:48:59
请看如下程序段(本人编写):

#include <stdio.h>
#include<stdlib.h>
#include <conio.h>

typedef struct
{
char num[8];
char name[9];
}DataType;

typedef struct node
{
DataType data;
struct node *next;
}ListNode;

typedef ListNode * LinkList;
LinkList head;

LinkList creatList(void)
{
ListNode *p,*rear;
char flag = 'y';
head = (ListNode *)malloc(sizeof(ListNode));
rear =head;
while(flag=='y'||flag=='Y')
{
p=(ListNode *)malloc(sizeof(ListNode));
printf("\n学号(8) 姓名(8)\n");
scanf("%s%s",p->data.num, p->data.name);
rear->next= p;
rear = p;
printf("继续输入吗?(y/n):");
flag = getch();
}
rear->next=NULL;
return head;
}

void printList(LinkList head)
{
ListNode *p;
p=head->

你的程序逻辑性还是比较强的
有两个小问题
1)输入有点错误
可以将你的scanf("%s%s",p->data.num, p->data.name); 改成:
gets(p->data.num);
gets(p->data.name);
2)判断节点相同时候判断条件错误
将你的if (q->data.name == p->data.name && q->data.num == p->data.num)
改成
if (strcmp(q->data.name,p->data.name)==0 && strcmp(q->data.num,p->data.num)==0 )
其中strcmp()是字符串比较函数,相等时候返回0
但是要注意添加头文件#include"string.h"

祝你成功

对链表中结点删除的算法是对的,比较算法也是对的。
但是你好像对字符串的概念和操作都不太熟悉,之所以不能删除,是因为对两个结点是否相同的比较出了问题:“if (q->data.name == p->data.name && q->data.num == p->data.num)”。num和name是字符数组,不能直接比较,需要把这句修改为:“if (!strcmp(q->data.name,p->data.name) && !strcmp(q->data.num, p->data.num))”,这样就可以删除结点了。

PS:在结点信息输出时还有个小问题(printf("%s,%s\n",p->data.num,p->data.name);),同样是字符串的问题

补充:
你的输出中有重复,如下:
00000001yangyang,yangyang
00000002xiaoqian,xiaoqian
你没遇到吗?