c语言实现单链表算法示例分享_C 语言

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef char DataType;
typedef struct Node{
    DataType data;
    struct Node * Next;
}ListNode,* LinkList;
void Judement(LinkList head){ //判断分配内存
    if (!head){
        printf("Overflow.");
        exit(-1);
    }
}
LinkList CreatListF(void){ //头插法创建Single Linked List
    DataType ch;
    LinkList head = (ListNode*)malloc(sizeof(ListNode));
    Judement(head);
    ListNode* s;
    ch = getchar();
    while (ch != '\n'){
        s = (ListNode*)malloc(sizeof(ListNode));
        Judement(s);
        s->data = ch;
        s->Next = head->Next;
        head->Next = s;
        ch = getchar();
    }
    return head;
}
LinkList CreatListS(void){ //尾插法创建Single Linked List
    char ch;
    ListNode* s;
    LinkList head = (ListNode*)malloc(sizeof(ListNode));
    Judement(head);
    ch = getchar();
    while (ch != '\n'){
        s = (ListNode*)malloc(sizeof(ListNode));
        Judement(s);
        s->data = ch;
        head->Next = s;
        head = s;
        ch = getchar();
    }
    head->Next = NULL;
    return head;
}
int GetLength(LinkList head){  //获取长度
    int length = 0;
    LinkList p = head->Next;
    while (p){
        length += 1;
        p = p->Next;
    }
    return length;
}
ListNode* GetNodeById(LinkList head, int i){ //依序号查找元素
    if (i<1 || i>GetLength(head)){
        exit(1);
    }
    int j=1; //防止极端情况扫描逾界
    LinkList p = head->Next;
    while (p != NULL && j < i){
        j += 1;
        p = p->Next;
    }
    return p;
}
ListNode* GetNodeByValue(LinkList head, DataType e){ //依值查找元素
    LinkList p = head->Next;
    while (p != NULL&&p->data != e){
        p = p->Next;
    }
    return p;
}
int InsertList(LinkList head, DataType e, int i){ //插入e值在第i节点
    if (i<1 || i>GetLength(head) + 1){
        exit(1);
    }
    LinkList s = (ListNode*)malloc(sizeof(ListNode));
    s->data = e;
    LinkList q, p = head;
    int j = 1;
    while (j <= i){
        q = p;
        p = p->Next;
        j += 1;
    }
    s->Next = q->Next;
    q->Next = s;
    return 0;
}
int DeleteListNodeById(LinkList head, int i){ //依序号删除节点
    int j = 1;
    ListNode* p,* q;
    if (i<1 || i>GetLength(head)){
        exit(1);
    }
    p = head;
    while (j < i){
        p = p->Next;
        j += 1;
    }
    q = p->Next;
    p->Next = q->Next;
    free(q);
    return 0;
}
int DeleteListRepeatNode(ListNode* head){ //清除冗余数据
    ListNode* p, *q, *s;
    if (p == NULL){
        exit(1);
    }
    p = head->Next; //首节点无数据
    while (p->Next != NULL){
        q = p;
        while (q->Next != NULL){
            if (q->Next->data == p->data){
                s = q->Next;
                q->Next = q->Next->Next;
                free(s);
            }
            q = q->Next;
        }
        p = p->Next;
    }
    return 0;
}

时间: 2024-08-22 14:22:43

c语言实现单链表算法示例分享_C 语言的相关文章

C数据结构之单链表详细示例分析_C 语言

复制代码 代码如下: #include <stdio.h>#include <stdlib.h>typedef struct type{ int num; struct type *next;}TYPE;//=============================================================// 语法格式: TYPE *init_link_head(int n)// 实现功能: 从头到尾,正序创建一个具有n个节点的链表,并对其值进行初始化//

纯c语言实现面向对象分析与示例分享_C 语言

C语言的对象化模型面向对象的特征主要包括:.封装,隐藏内部实现.继承,复用现有代码.多态,改写对象行为1.1  封装封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性.封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的.封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来

c语言尾队列tailq使用示例分享_C 语言

queue和list的结构定义和操作都在'sys/queue.h'中完成, 主要定义了下面四种数据结构: 1单向列表(single-linked lists)2单向尾队列(single-linked tail queue)3列表(lists)4尾队列(tail queues) 使用示例 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <sys/queue.h> /*  定义一个结构体,它只是尾队列的一个元

C语言单链表常见操作汇总_C 语言

C语言的单链表是常用的数据结构之一,本文总结了单链表的常见操作,实例如下: #include<stdio.h> #include<stdlib.h> //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node *next; }LNode,*LinkList; //创建单链表 void Build(LinkList L) { int n; LinkList p,q; p=L; pr

用C语言获取文件的大小示例分享_C 语言

查了一下发现同C语言的文件操作函数便可以很容易的实现这样的功能.在自己实现的函数中使用到的函数就只有fseek和ftell.它们的说明如下: fseek 语法: #include <stdio.h> int fseek( FILE *stream, long offset, int origin ); 函数fseek()为给出的流设置位置数据. origin的值应该是下列值其中之一(在stdio.h中定义): 名称 说明 SEEK_SET 从文件的开始处开始搜索 SEEK_CUR 从当前位置开

C语言 变量详解及示例代码_C 语言

C 变量 变量其实只不过是程序可操作的存储区的名称.C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以由字母.数字和下划线字符组成.它必须以字母或下划线开头.大写字母和小写字母是不同的,因为 C 是大小写敏感的.基于前一章讲解的基本类型,有以下几种基本的变量类型: 类型 描述 char 通常是一个八位字节(一个字节).这是一个整数类型. int 对机器而言,整数的最自然的大小. float 单精度浮点值. doub

C语言打印杨辉三角示例汇总_C 语言

杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

C语言实现的bitmap位图代码分享_C 语言

事实上,我们是用每一个 元素表示一个32位的二进制字符串,这样这个元素可以保留相邻32个号码是否存在的信息,数组范围就下降到10000000/32了.例如对于号码 89256,由于89256 mod 32=2789-8,这样我们应该置a[2789]中32位字符串的第8位(从低位数起)为1. #define WORD 32 #define SHIFT 5 ////移动5个位,左移则相当于乘以32,右移相当于除以32取整 #define MASK 0x1F //16进制下的31 #define N

使用c语言生成随机数的示例分享_C 语言

这是一个自己用c写的不重复产生随机数的代码,且只有输入q才能退出程序. 复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <time.h>#define MAX  100 int main(void){ int i, j, flag, num, a[MAX] = { 0 }, max, ch; srand((unsigned)time(NULL));  printf("Please input m