大师兄帮忙看看,代码错误主要在主函数里面,进行链表去重,逻辑上没问题,但就是输出不出来
#include <stdio.h>
#include <malloc.h>
/*
* 结构体内存对齐大小
*
*
* */
//一个节点
typedef struct listNode{
int data;
// 下一个节点的地址
struct listNode * next;
}listNode;
//链表
typedef struct linkedList{
// 指向头结点的地址
struct listNode* heda;
// 大小
size_t size;
}linkedList;
//创建链表
void createLinkList(linkedList* list){
// 头指针指向空
list->heda=NULL;
// 链表的大小设置为0
list->size=0;
}
//销毁链表
void destroyLinkList(linkedList* list){
// 遍历头结点
while(list->heda){
// 将所有数据存储在temp里面
listNode* temp = list->heda;
// 剥离头结点
list->heda=list->heda->next;
free(temp);
}
// 将长度设置为0
list->size=0;
}
//***************链表的增删改查**********
//增加
void insertIntoLinkList(linkedList* list,int index,int element){
if(index<0||index>list->size){
printf("Invalid index");
return;
}
// 生成新的节点
listNode* newNode = (listNode*)malloc(sizeof (listNode));
newNode->data=element;
// 如果下标为0,就是头结点
if(index==0){
// 新节点的后继节点为原来的头结点
newNode->next=list->heda;
// 将链表头改为新生成的节点
list->heda=newNode;
}else{
listNode * current=list->heda;
for (int i = 0; i < index-1; ++i) {
// 找到要插入的前驱节点
current=current->next;
}
newNode->next=current->next;
current->next=newNode;
}
list->size++;
/*
* 第一步判断插入位置是否合法
* 第二步给定的元素,生成一个链表节点
* 第三部插入位置是0,设置成头结点
* 第四部不是零,就插入到这个位置的前一个位置
* 第五步更新链表的大小,对大小进行+1
* */
}
//链表指针的删除
void deleteLinkList(linkedList * list,int i){
// 判断下标是否和发
if(i<0||i>list->size){
printf("Invalid index");
return;
}
if(i==0){
listNode * next= list->heda->next;
//释放掉原来的头结点
free(list->heda);
// 将头结点指向next节点
list->heda=next;
}else{
listNode* current =list->heda;
// 循环到下标的前一个节点
for (int j = 0; j < i-1; ++j) {
current=current->next;
}
listNode* next =current->next->next;
// 释放当前这个节点的下一个节点
free(current->next);
// 当前节点的下一个节点指向下一个的下一个
current->next=next;
}
// 长度-1
--list->size;
}
//链表元素的查找
listNode* LinkListFind(linkedList* list, int element){
listNode* current= list->heda;
while (current){
if(current->data==element){
return current;
}
current=current->next;
}
return NULL;
}
//根据下标进行查询
listNode* LinkListGet(linkedList* list, int i){
// 判断下表是否合法
if(i < 0 || i>list->size){
printf("Invalid index");
return NULL;
}
// 否则从链表头开始遍历,遍历到下标并进行返回
listNode* current= list->heda;
for (int j = 0; j < i; ++j) {
current=current->next;
}
return current;
}
//对于链表节点的修改
void LinkListUpdate (linkedList* list, int i, int value){
listNode* node= LinkListGet(list,i);
if(node){
node->data=value;
}
}
//打印链表
void LinkListPrint(linkedList* list){
listNode* current= list->heda;
while (current){
printf("%d ->",current->data);
current=current->next;
}
// 循环结束在打印null代表链表结束
printf("NULL \n");
}
int main() {
int n;
setbuf(stdout, NULL);
while(scanf("%d",&n)!=EOF){
if(n==0){
// 当n=0跳出循环
//我进来了
printf("我是n==0");
break;
}
// 初始化一个链表
linkedList list;
createLinkList(&list);
// 输入n个数
for (int i = 0; i < n; ++i) {
int x;
// 接受一个输入的数
scanf("%d",&x);
// 将接受的数插入到链表中
insertIntoLinkList(&list,i,x);
}
LinkListPrint(&list);
// *******主要错误还是在这****************循环链表,找到相同的
listNode * current = list.heda;
LinkListPrint(¤t);
while(current){
listNode * next =current->next;
if(next==NULL) break;
if(next->data==current->data){
current->next=next->next;
free(next);
}else {
current = current->next;
}
}
printf("我是修改后的\n");
LinkListPrint(¤t);
// int sum=0;
// for (int i = 0; i < n; ++i) {
// 根据下标进行获取元素,并加到sum里面
// sum+= LinkListGet(&list,i)->data;
// }
// printf("%d\n",sum);
destroyLinkList(&list);
}
return 0;
}