单链表去除重复的数据

 大师兄帮忙看看,代码错误主要在主函数里面,进行链表去重,逻辑上没问题,但就是输出不出来

#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(&current);
      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(&current);






//        int sum=0;
//        for (int i = 0; i < n; ++i) {
//       根据下标进行获取元素,并加到sum里面
//            sum+= LinkListGet(&list,i)->data;
//        }
//        printf("%d\n",sum);
        destroyLinkList(&list);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值