关于c语言链表的操作

这几天又讲到链表了,但是又忘记了,所以重新把关于链表的建链表,对链表进行排序,然后是删除,插入,以及遍历等功能。。但是最近要考试了,所以没有写成菜单的形式。。等考试完了,在进行补充吧。。

代码如下。。。

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

int main()
{
    /*建立链表操作*/
    int n,x,pos,t,number;
    int i,j,temp;
    struct node *head,*p,*tail,*last,*current;
    struct node *p1,*p2;
    printf("input numbers end of 0:\n");
    head=NULL;
    scanf("%d",&n);
    p=(struct node *)malloc(sizeof(struct node));
    p->data=n;
    p->next=head;
    head=p;
    tail=p;
    scanf("%d",&n);
    number=1;
    while(n)
    {
       number++;
       p=(struct node *)malloc(sizeof(struct node));
       p->data=n;
       p->next=NULL;
       tail->next=p;
       tail=p;
       scanf("%d",&n);
    }
    p=head;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    /*建立链表操作*/
     /*链表的排序操作*/
     /*选择排序法*/
    for(p1=head,i=0;i<number-1;i++,p1=p1->next)
        for(p2=p1->next,j=i+1;j<number;j++,p2=p2->next)
    {
        if(p1->data>p2->data)
        {
            temp=p1->data;
            p1->data=p2->data;
            p2->data=temp;
        }
    }
    /*冒泡排序*/
    printf("排序后的链表\n");
    p=head;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    for(i=0;i<number-1;i++)
        for(p1=head,p2=p1->next,j=0;j<number-i-1;j++,p1=p2,p2=p2->next)
    {
        if(p1->data>p2->data)
        {
            temp=p1->data;
            p1->data=p2->data;
            p2->data=temp;
        }
    }
    printf("排序后的链表\n");
    p=head;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    /*对于删除操作要用到两个指针,一个是遍历指针,一个是last指针。*/
    /*链表的插入操作*/
    /*实行删除操作*/
    printf("请输入命令:1代表执行 0表退出\n");
    scanf("%d",&pos);
    while(pos)
    {
    printf("请输入您想删除的数字\n");
    scanf("%d",&x);
    p=head;
    while(p->data!=x&&p->next!=NULL)
    {
       last=p;
       p=p->next;
    }
    if(head->data==x)//要删除的元素在头部
     head=p->next;
    else if(p->data==x)//要删除的元素在中间或则尾部
     last->next=p->next;
    else//错误的输入
     printf("fuck 错误输入\n");
    p=head;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
    printf("请输入命令:1代表执行 0代表退出\n");
    scanf("%d",&pos);
    }
    /*实行删除操作*/
    /*插入操作要用到3个指针,一个current指针,一个last指针,还有一个是插入的那一个*/
    printf("将执行插入操作\n");
    printf("请输入命令:1代表执行 0代表退出\n");
    scanf("%d",&pos);
    while(pos)
    {
        printf("请输入您想插入的数\n");
        scanf("%d",&t);
        p=(struct node *)malloc(sizeof(struct node));
        p->data=t;
        current=head;
        while(current->data<t&¤t->next!=NULL)
        {
            last=current;
            current=current->next;
        }//查找t在有序数列中的位置
        if(t<head->data)//如果插入的数字在头部
        {
            p->next=head;
            head=p;
        }
        else if(current->next==NULL)//如果插入的数在尾部
        {
           p->next=NULL;
           current->next=p;
        }
        else//插入的数在中间
        {
            p->next=current;
            last->next=p;
        }
        p=head;
        while(p!=NULL)
        {
              printf("%d ",p->data);
              p=p->next;
        }
    printf("\n");
    printf("请输入命令:1代表执行 0代表退出\n");
    scanf("%d",&pos);
    }
    /*链表的插入操作*/
    return 0;
}

/*
测试用例
1 2 15 4 10 100 78 0
*/

关于c语言链表的操作

时间: 2024-10-26 18:43:49

关于c语言链表的操作的相关文章

C语言链表各类操作详解

链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.因此,head指向第一个元素:第一个元素又指向第二个元素:……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束.        链表的各类操

C语言之----面向对象的方法实现链表的操作

1 /* 2 * 详细运行过程: 本程序实现的是对链表的简单的操作,即链表的增 删 改 查 销毁 初始化 3 * 运用面向对象的思想,实现一个类op,op中包括了所有的链表操作方法 4 * 其他的程序调用op类,实现对表链表的操作 5 * 链表包括 6 * 面向对象,简单易学程序更加紧凑,更加健壮,更安全 7 */ 8 #include<string.h> 9 #include<stdlib.h> 10 #include<stdio.h> 11 12 #define o

C语言-链表

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

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

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

C语言之文件操作08——总结

C程序的文件操作共涵盖7个例题,包含格式打印,文件读取,条件查找,矩阵的文件操作,数据格式输入及调用计算等内容. 文件操作使得程序有更强的拓展性,使其可以单独保存数据,这为程序的调试和优化打下了坚实的基础,为我们实现大规模计算提供了可能.至此,相信大家对文件操作也有了比较好的认识,无非是写入.读取.调用. 我们常常会听说C的强大,也是因为她有着文件操作的功能,而文件数据是可以方便重写和维护的. MATLAB数学软件是一款十分强大的工具型软件,它是通过C语言来表达算法的,作为面向过程的编程语言C,

015_C语言中文件操作

 文件:存储在外部介质上的数据集合 ASCII码文件和二进制文件 流式文件和非流式文件 在内存中只有1和0,电脑在显示文件时,按一定编码显示 流式文件:输入输出的数据流的开始和结束仅受程序控制而不受物理符号控制 缓冲文件和非缓冲文件 每一个使用的文件都会在内存中开辟一个缓冲区 文件打开fopen 文件关闭fclose 读到文件末尾时即读到EOF 文件操作所用到的函数fgetc/fputc  fgets/fputs   fscanf/fprintf等一些函数使用时可同过帮助文档得知 文件定位函

c语言中字符串操作的工具类

 1.编写头文件 #define _CRT_SECURE_NO_WARNINGS //#pragmawarning(disable:4996) #include <stdio.h> #include <stdlib.h> #include <string.h> struct CString { char *p;        //保存字符串首地址 int reallength; //实际长度 }; typedef struct CString mystring;//

C语言——链表

//链表的操作 #include<stdio.h> #include<malloc.h> #define NULL 0 #define LEN sizeof(struct student) struct student { long num; float score; struct student *next; };//结点 int n;//存放结点个数 struct student *creat()//创建链表 { struct student *head;//头指针 struc

数据结构之链表单向操作总结

链表是数据结构的基础内容之一,下面就链表操作中的创建链表.打印链表.求取链表长度.判断链表是否为空.查找结点.插入结点.删除结点.逆转链表.连接链表.链表结点排序等进行总结. 1.创建表示结点的类,因为链表操作中需要比较结点,因此结点需要实现comparable接口. public class Node implements Comparable<Node> { private Object data; private Node next; //构造函数 public Node() { thi