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("插入位置错误!\n");
exit(0);
}
else
{
printf("插入成功!\n");
}
if(A->l >= ListSize)
{
printf("列表溢出!\n");
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("列表为空!\n");
exit(0);
}
if(i<1 || i>A->l)
{
printf("删除位置错误!\n\n");
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("\n");
}


void main()
{
SeqList *A=(SeqList*)malloc(sizeof(SeqList));    
int a=7;
printf("请输入7个整型元素:\n");
     CreateList(A,a);
printf("输出SeqList的长度: \n");
printf("长度=%d\n",A->l);
printf("表内元素为");
     DisList(A);
DataType x;
printf("请输入需要插入的元素的位置!\n");
int i;
scanf("%d",&i);
printf("请输入需要插入的元素!\n");
scanf("%d",&x);
     InsertList(A,x,i);
printf("长度=%d\n",A->l);
printf("表内元素为");
     DisList(A);
printf("请输入需要删除的元素的位置!\n");
scanf("%d",&i);
     DeleteList(A,i);
printf("表内元素为");
     DisList(A);
printf("长度=%d\n",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("申请内存空间失败\n");
    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("\n");
 
    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("\n");
    printf("请输入需要删除的数据的值:");
    scanf("%d",&x);
    LinkedListDelete(list,x); 
    for(start = list->next; start != NULL; start = start->next)
    printf("%d ",start->data);
    printf("\n");
    return 0;
}

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

posted @ 2019-12-11 17:25  悦悦的狗子  阅读(1592)  评论(0编辑  收藏  举报