C语言:链表

#include <stdio.h>
#include <stdlib.h>
struct LNode{
    int data;
    struct LNode *next;
};

void create(struct LNode *L);//创建链表
void clearlist(struct LNode *L);//清除链表
void print(struct LNode *L);//打印链表

void search(struct LNode *L,int loc);//查找
void deldata(struct LNode *L,int loc);//删除
void insert (struct LNode *L,int loc,int data);//插入

void sort_bubble(struct LNode *L);
void sort_insert(struct LNode *L);

int main()
{
    int loc;
    int data;
    struct LNode *linklist;//定义一个头指针(链表的描述)
    create(linklist);

    print(linklist);

  //  clearlist(linklist);
  //  print(linklist);
/*
    printf("查找第几个节点:");
    scanf("%d",&loc);
    search(linklist,loc);

    printf("删除第几个节点:");
    scanf("%d",&loc);
    deldata(linklist,loc);
    print(linklist);

    printf("插入到第几个节点以及值:");
    scanf("%d %d",&loc,&data);
    insert(linklist,loc,data);
    print(linklist);
    */

    //sort_bubble(linklist);
   // printf("排序后:\n");
   // print(linklist);
}

/*直接插入排序*/
void sort_insert(struct LNode *L){
    struct LNode *p,*temp;
    p = L->next;

    while(p){
        if(p->next->data < p->data){
            temp = p->next;

        }
    }
}

/*冒泡排序
不是标准的冒泡排序,因为他不是相连交换
一次p循环确定一个最小值
*/
void sort_bubble(struct LNode *L){

    /*
    p = L->next;
    q = p->next;
    while(p){
        while(q){
            if(p->data >= q->data){
                temp = p->data;
                p->data = q->data;
                q->data = temp;
            }
            q = q->next;
        }
        p = p->next;
        if(p==NULL)
            return 0;
        q = p->next;
    }
    */
}

/*把data插入到loc位置----p定位的是第‘loc-1’个数据节点*/
void insert (struct LNode *L,int loc,int data){
    struct LNode *p,*q;
    int j = 1;
    p = L;
    while(p && (j<loc)){     //p定位的是第‘loc-1’个数据节点
        p = p->next;
        j++;
    }
    if(!p || (j>loc)){
        printf("超出范围\n");
        return -1;
    }

    q = (struct LNode *)malloc(sizeof(struct LNode));
    q->data = data;
    q->next = p->next;//原来的loc接到q后面
    p->next = q;   //q接到‘loc-1’后面,变成loc
    return 0;
}

/*删除第loc个节点:------p定位的是第‘loc-1’个数据节点*/
void deldata(struct LNode *L,int loc){
    struct LNode *p,*q;
    int j = 1;
    p = L; //p指向头节点
    while(p && (j<loc)){       //p定位的是第‘loc-1’个数据节点
        p=p->next;
        j++;
    }
    if(!p || (j>loc)){
        printf("查找超出范围\n");
        return -1;
    }

    q = p->next;//q定位的是第loc个数据节点
    p->next = q->next; //loc+1接到loc-1的后面
    free(q);  //删除loc

    return 0;
}

/*查找第loc个节点的值-----p定位的是第‘loc’个数据节点*/
void search(struct LNode *L,int loc){
    struct LNode *p;

    int j=1;
    p = L->next;  //头指针从头结点指向第一个数据节点

    while(p && (j<loc)){
        p = p->next;
        j++;
    }
    if(!p || (j>loc)){
        printf("查找超出范围\n");
        return -1;
    }
    printf("第%d个节点的值是:%d\n",loc,p->data);
}

/*
创建链表
头指针指向头节点,头结点的内容为链表的长度
*/
void create(struct LNode *L){
    struct LNode *rear,*p;
    int data;
    int length = 0;

    rear = L;

    printf("输入元素的值,并以\"-1\"结束:\n");
    scanf("%d",&data);
    while(data+1){
        p = (struct LNode*)malloc(sizeof(struct LNode)); //新建节点
        p->data = data;
        rear->next = p;

        rear = p;
        length++;  //链表长度加1
        scanf("%d",&data);
    }
    rear->next = NULL;
    L->data = length;
}

/*清除链表的内容*/
void clearlist(struct LNode *L){
    struct LNode *p,*q;
    p = L->next;
    while(p){
        q = p->next;  //保存下一个节点
        free(p);  //删除当前节点
        p = q;
    }
    L->next = NULL;
    return 0;
}

/*打印链表的内容*/
void print(struct LNode *L){
    struct LNode *p;
    printf("链表的内容是 :");
    p = L->next;//头指针从头结点指向第一个数据节点
    while(p){
        printf("%d  ",p->data);
        p = p->next;
    }
    printf("链表的长度是 :%d\n",L->data);
    return 0;
}
时间: 2024-11-05 14:55:40

C语言:链表的相关文章

C语言-链表

单向链表:结构体非常适合链表结构,链表的组成:head指针.数据块节点指针p->nest.结束指针NULL. 链表操作:需要首先找到表头head指针.链表的操作包括动态链表的创建.顺序输出.删除节点.插入节点的操作. 动态存储操作函数:(ANSI规则返回的指针类型为void*,早期的为字符型指针) 分配一个块:void *malloc(unsigned int size)  //分配成功则返回指向起始地址的指针void * 分配多个块:void *calloc(unsigned n,unsign

关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能..但是最近要考试了,所以没有写成菜单的形式..等考试完了,在进行补充吧.. 代码如下... #include<stdio.h> #include<stdlib.h> #include<string.h> struct node { int data; struct node *next; }; int main() { /*建立链表操作*/ int n,x,p

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量.以下的每个结点都分为两个域,一个是数据域,存放各种实际的数据,如学号 num,姓名 name,性别 sex 和成绩 score 等.另一个域为指针域,存放下一结点的首地址.链表中的每一个结点都是同一种结构类型. 指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域. 在第一个结点的指针域内存入第二个结点的首地址,在第二个结点的指针域

c语言链表和指针的运用

在学习指针之前,首先要认识指针.指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针. 根据出现的位置不同,操作符 * 既可以用来声明一个指针变量,也可以用作指针的取值.当用在声明一个变量时,*表示这里声明了一个指针.其它情况用到*表示指针的取值.&是地址操作符,用来引用一个内存地址.通过在变量名字前使用&操作符,我们可以得到该变量的内存地址.

C语言链表的来源分析

C语言中的链表是重点,也是难点,而且意义非凡.对链表的的抽象和恐惧是源于对它的来龙去脉的不明白.所以很有必要对它的发展渊源做透彻分析. 链表的单位是节点,而节点源于复合数据类型:结构体: 节点和结构体的区别就是看是否有指针域,目的就是想找到下一个节点: 结构体形如: struct Ghost { char name[30]; int age; int height; char addr[30]; }; 节点形如: struct Ghost { char name[30]; int age; in

注释最全的C语言链表的增删改查

1 //这是C语言的写法,但会报错,原因是len(当前的节点长度) 2 //无法在insert(插入)和deleted(删除)之后改变 3 //不能使用delete是因为delete是C++中的一个运算符 4 //最终我把改程序用C++写了一遍,运用引用将len的真实值改变了 5 #include <stdio.h> 6 #include <stdlib.h> 7 typedef int ElementType; 8 typedef struct node { 9 ElementT

C语言链表

#define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" typedef struct _Teacher { int age; struct _Teacher *next; }Teacher; Teacher* create_teacher(); int print_teacher(Teacher * pHeader); int add_teacher(Teacher * pHead

C语言----------链表的简单操作

#include <stdio.h> #include <malloc.h> typedef struct node{ //定义节点类型 char data; //数据域 struct node *next; //指针域 }linklist; linklist* Create(){ //创建链表 char key; linklist *phead; //头指针 linklist *pnew; //新节点 linklist *pend; //尾指针 phead = (linklist

C语言链表的简单实用

// //  ViewController.m //  链表 // //  Created by 张凯泽 on 16/1/26. //  Copyright © 2016年 rytong_zkz. All rights reserved. // #import "ViewController.h" /* static 关键字的作用: (1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, 因此其值在下次调用时仍维持上次的值: (2)在

C语言 链表排序

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 5 typedef struct node{ 6 int data; // 存放数据 7 struct node* next; // 下一节点 8 }ListNode; 9 10 extern int CSort(); 11 12 ListNode *root = NULL;// 13 14 int main(int argc, char