zoukankan      html  css  js  c++  java
  • C语言——线性表及其应用

    程序要求

    1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。
    2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。
    3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。
    输入和输出的格式

    1.顺序线性表的建立、插入及删除

    顺序表

    #include<stdio.h>
    #include<stdlib.h>
    
    #define ListSize 50
    typedef int DataType;
    
    //线性表的顺序存储方式
    typedef struct {
    DataType data[ListSize];
    int l;
    }SeqList;
    
    
    //创建顺序线性表
    void CreateList(SeqList *A,int n)
    {
    int i;
    for(i=0;i<n;i++)
    {
    scanf("%d",&(A->data[i]));
    }
    A->l=n;
    }
    
    
    //在顺序线性表中插入某个元素
    void InsertList(SeqList *A,DataType x,int i)
    {
    int j;
    if(i<1 || i>A->l)       //插入时的条件
    {
    printf("插入位置错误!
    ");
    exit(0);
    }
    else
    {
    printf("插入成功!
    ");
    }
    if(A->l >= ListSize)
    {
    printf("列表溢出!
    ");
    exit(0);
    }
    for(j=A->l-1;j>=i-1;j--)
    {
    A->data[j+1]=A->data[j];          //插入时,把各个元素向后移动后,然后在进行插入
    }
    A->data[i-1]=x;
    A->l++;
    }
     
    
    //在顺序线性表中删除某个元素
    void DeleteList(SeqList *A,int i)
    {
    int j;
    if(A->l==0)                     //删除时的条件
    {
    printf("列表为空!
    ");
    exit(0);
    }
    if(i<1 || i>A->l)
    {
    printf("删除位置错误!
    
    ");
    exit(0);
    }
    for(j=i;j<=A->l-1;j++)      //删除时,把各个元素向前移动,覆盖掉要删除的元素
    {
    A->data[j-1]=A->data[j];
    }
    A->l--;
    }
    
    //输出线性表
    void DisList(SeqList *L)
    {
    int i;
     for(i=0;i<L->l;i++)
    printf("%d ",L->data[i]);
    printf("
    ");
    }
    
    
    void main()
    {
    SeqList *A=(SeqList*)malloc(sizeof(SeqList));    
    int a=7;
    printf("请输入7个整型元素:
    ");
         CreateList(A,a);
    printf("输出SeqList的长度: 
    ");
    printf("长度=%d
    ",A->l);
    printf("表内元素为");
         DisList(A);
    DataType x;
    printf("请输入需要插入的元素的位置!
    ");
    int i;
    scanf("%d",&i);
    printf("请输入需要插入的元素!
    ");
    scanf("%d",&x);
         InsertList(A,x,i);
    printf("长度=%d
    ",A->l);
    printf("表内元素为");
         DisList(A);
    printf("请输入需要删除的元素的位置!
    ");
    scanf("%d",&i);
         DeleteList(A,i);
    printf("表内元素为");
         DisList(A);
    printf("长度=%d
    ",A->l);
    }

    输入和输出的格式
    顺序表输入输出:定义输入7个整型元素,回车进行插入和删除,输出线性表

     2.链式线性表的建立、插入及删除

    单链表

    #include <stdio.h>
    #include <stdlib.h>
     
    typedef int ElemType;
     
    //定义结点类型 
    typedef struct Node
    {
        ElemType data;              //单链表中的数据域 
        struct Node *next;          //单链表的指针域 
    }Node,*LinkedList;
     
     //单链表的初始化
    LinkedList LinkedListInit()
    {
        Node *A;
        A = (Node *)malloc(sizeof(Node));   //申请结点空间 
        if(A == NULL)                       //判断是否有足够的内存空间 
        printf("申请内存空间失败
    ");
        A->next = NULL;                     //将next设置为NULL,初始长度为0的单链表 
     return A;
    }
     
    
     //单链表的建立
    LinkedList LinkedListCreat()
    {
        Node *A;
        A = (Node *)malloc(sizeof(Node));   //申请头结点空间
        A->next = NULL;                     //初始化一个空链表
        Node *r;
        r = A;                              
        ElemType x;                        
        while(scanf("%d",&x) != EOF)
        {
            Node *p;
            p = (Node *)malloc(sizeof(Node));   
            p->data = x;                      
            r->next = p;                   
            r = p; 
        }
        r->next = NULL; 
        return A;   
    }
     
    
     //单链表的插入,在链表的第i个位置插入x的元素
    LinkedList LinkedListInsert(LinkedList A,int i,ElemType x)
    {
        Node *pre;                            //pre为前驱结点 
        pre = A;
        int tempi = 0;
        for (tempi = 1; tempi < i; tempi++)
            pre = pre->next;                  //查找第i个位置的前驱结点 
        Node *p;                              //插入的结点为p
        p = (Node *)malloc(sizeof(Node));
        p->data = x; 
        p->next = pre->next;
        pre->next = p;
        return A;                           
    } 
     
    
     //单链表的删除,在链表中删除数据值为x的元素
    LinkedList LinkedListDelete(LinkedList A,ElemType x)
    {
        Node *p,*pre;                     //pre为前驱结点,p为查找的结点。 
        p = A->next;
        while(p->data != x)              //查找值为x的元素 
        {   
            pre = p; 
            p = p->next;
        }
        pre->next = p->next;          //删除操作,将其前驱next指向其后继。 
        free(p);
        return A;
    } 
     
     int main()
    {
        LinkedList list,start;
        printf("请输入需要添加单链表的数据:"); 
        list = LinkedListCreat();
        for(start = list->next; start != NULL; start = start->next)
        printf("%d ",start->data);
        printf("
    ");
     
        int i;
        ElemType x;
        printf("请输入需要插入数据的位置:");
        scanf("%d",&i);
        printf("请输入需要插入数据的值:");
        scanf("%d",&x);
        LinkedListInsert(list,i,x);
        for(start = list->next; start != NULL; start = start->next)
        printf("%d ",start->data);
        printf("
    ");
        printf("请输入需要删除的数据的值:");
        scanf("%d",&x);
        LinkedListDelete(list,x); 
        for(start = list->next; start != NULL; start = start->next)
        printf("%d ",start->data);
        printf("
    ");
        return 0;
    }

    输入和输出的格式
    单链表输入输出:本程序可以输入多个整型数据元素
    请输入第一个整数,回车输入下一个数
    请输入第二个整数......最后输入Ctrl+z结束输入,进行插入和删除,最后输出单链表

  • 相关阅读:
    iOS使用Charles(青花瓷)抓包并篡改返回数据图文详解(转)
    iOS 9 添加白名单
    iOS 中字体的应用(转)
    iOS 后台操作的开发(转)
    iOS 知识点大总结(转)
    在Xcode中找中文字符串(正则表达式)
    block 使用时的注意点(转)
    xcode armv6 armv7 armv7s arm64 (转)
    使用Android studio过程中发现的几个解决R变红的办法
    折腾了一晚上的“equals”和“==”
  • 原文地址:https://www.cnblogs.com/zhangyuan1024/p/12023851.html
Copyright © 2011-2022 走看看