C语言——线性表及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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");
return0;
}
输⼊和输出的格式
单链表输⼊输出:本程序可以输⼊多个整型数据元素
请输⼊第⼀个整数,回车输⼊下⼀个数
请输⼊第⼆个整数......最后输⼊Ctrl+z结束输⼊,进⾏插⼊和删除,最后输出单链表。

相关文档
最新文档