单向链表之创建特殊链表及跑链表习题

一、有关创建链表
①设数据集合A,其值均为正整数,无序且含有重复值。创建一个单向链表,每个结点数据域的值为数据集合的值且不重复
例A={3,2,2,3,5,3,8,5,2}
创建后的链表如下:
在这里插入图片描述
在这里插入图片描述
代码如下:

#include<stdio.h>
#define  N  8
typedef  struct  node{
     int  date;
     int count;
     struct node *next;
}ElemSN;

ElemSN  *CreateLink(int a[]){
     ElemSN  *t,*h,*p;
     h = null;
     for(int i = 0 ;i < N ;i++){
           for(p = h ;p && p->date-a[i];t = p,p= p->next);
           if(p)  //在链表中已经存入,只需要计数即可
               p->count++;
           else{//还未存入链表
                p = (ElemSN *)malloc(sizeof(ElemSN));
                p ->date = a[i];
                p ->next = null;
                if(!h) 
                    h = t =p;
                else
                    t = t->next = p;
           }
    }
}


int main(void)
{
    int a[N]= {3,2,2,3,5,3,8,5,2};
    ElemSN  *head;
    head = CreateLinnk(a);
    //输出
    printLink(head);
}

思路:
遍历集合a,在链表中找看是否存在存在集合a中的元素,如果链表中p->date=-a[i],表示存在这个元素

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
单向链表创建: ```c #include <stdio.h> #include <stdlib.h> //定义链表节点结构体 typedef struct ListNode{ int val; struct ListNode* next; } ListNode; //创建链表函数 ListNode* createList(int* arr, int size){ ListNode* head = NULL; //链表头结点 ListNode* tail = NULL; //链表尾结点 for(int i=0; i<size; i++){ //创建节点 ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->val = arr[i]; node->next = NULL; //如果是第一个节点,设置为头结点 if(head == NULL){ head = node; tail = node; } //否则将新节点插入到链表尾部 else{ tail->next = node; tail = node; } } return head; } //打印链表函数 void printList(ListNode* head){ while(head != NULL){ printf("%d ", head->val); head = head->next; } printf("\n"); } int main(){ int arr[] = {1, 2, 3, 4, 5}; int size = sizeof(arr) / sizeof(arr[0]); ListNode* head = createList(arr, size); printList(head); return 0; } ``` 单向链表的数据删除: ```c #include <stdio.h> #include <stdlib.h> //定义链表节点结构体 typedef struct ListNode{ int val; struct ListNode* next; } ListNode; //创建链表函数 ListNode* createList(int* arr, int size){ ListNode* head = NULL; //链表头结点 ListNode* tail = NULL; //链表尾结点 for(int i=0; i<size; i++){ //创建节点 ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->val = arr[i]; node->next = NULL; //如果是第一个节点,设置为头结点 if(head == NULL){ head = node; tail = node; } //否则将新节点插入到链表尾部 else{ tail->next = node; tail = node; } } return head; } //打印链表函数 void printList(ListNode* head){ while(head != NULL){ printf("%d ", head->val); head = head->next; } printf("\n"); } //删除链表节点函数 ListNode* deleteNode(ListNode* head, int val){ //如果头结点就是要被删除的节点 if(head != NULL && head->val == val){ head = head->next; return head; } //否则遍历链表,找到要被删除的节点 ListNode* cur = head; while(cur != NULL && cur->next != NULL){ if(cur->next->val == val){ cur->next = cur->next->next; break; } cur = cur->next; } return head; } int main(){ int arr[] = {1, 2, 3, 4, 5}; int size = sizeof(arr) / sizeof(arr[0]); ListNode* head = createList(arr, size); printList(head); head = deleteNode(head, 3); printList(head); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值