C语言,线性表(顺序表 链表)

C语言数据结构中两个常见的线性表,用来存储数据等;

一、建立顺序表

定义  将线性表中的元素相继存放在一个连续的存储空间中。         

  可利用一维数组描述存储结构

特点   线性表的顺序存储方式

遍历   顺序访问, 可以随机存取

+++++++++++++++++++++++++++++++++++

顺序表代码:

#include <stdio.h>
#define MAXSIZE 100//定义数组长度
#define OK 1
#define ERROR 0//定义函数返回状态值
typedef int status;
typedef struct sqlist
{
int data[MAXSIZE];
int len;
}sqlist;//定义数据类型;


void initlist(sqlist *p)//初始化函数
{
p->len = 0;
printf("顺序表初始化完成!\n");
}


status insertlist(sqlist *p)//插入函数
{
int pos,e;//定义位子和内容
printf("请输入要插入的位置和数字,用空格分开,以回车结束\n");
scanf("%d %d",&pos,&e);
if (p->len == MAXSIZE)
{
printf("顺序表已满,无法插入!\n");
return ERROR;
}
if (pos <= 0 || pos > MAXSIZE)
{
printf("插入位子错误,请重新插入!\n");
return ERROR;
}//排除出错情况
int i;
for (i = p->len-1; i >= pos-1 ; i--)
{
p->data[i+1] = p->data[i];//移动数据,提供空位给要插入的数据;
}
p->data[pos - 1] = e;//插入
p->len++;//不要忘记长度加一
return OK;
}


status deletelist(sqlist *p)//删除函数
{
int pos,e;
printf("请输入要删除的位子!\n");
scanf("%d",&pos);
if (p->len == 0)
{
printf("当前顺序表为空,无法删除!\n");
return ERROR;
}
if (pos < 1 || pos > MAXSIZE)
{
printf("输入位子错误,请重新输入!\n");
return ERROR;
}//排除出错情况;
e = p->data[pos-1];
printf("删除的元素为%d\n",&e);
int i;
for (i = pos; i < p->len-1; ++i)
{
p->data[i-1] = p->data[i];//移动数据
}
p->len--;//最后长度减一
return OK;


}


status getlist(sqlist p)//获取一个元素
{
int pos;//第几个元素
printf("请输入要获取第几个元素!\n");
scanf("%d",&pos);
printf("读取的元素%d\n",p.data[pos-1]);
return OK;
}


void print(sqlist p)//打印函数
{
if (p.len == 0)
{
printf("当前顺序表为空,无法打印!\n");
}

//排除出错情况
int i;
int j = 0;
for (i = 0; i < p.len-1; ++i)
{
printf("%2d",p.data[i] );
j++;
if (j%5 == 0)//5个一行
{
printf("\n");
}
}
printf("\n");
}

以上是顺序表的各个功能函数;

主函数调用各个功能函数;

int main()

{

sqlist sq;//定义一个顺序表
int sel;
printf("欢迎使用顺序表!\n");
initlist(&sq);//一定要初始化
while(1)
{
printf("\t\tmenu\n");
printf("\t\t1、插入\n");
printf("\t\t2、删除\n");
printf("\t\t3、读取\n");
printf("\t\t4、打印\n");
printf("\t\t5、退出\n");
scanf("%d",&sel);
switch(sel)
{
case 1:
{
if(insertlist(&sq) == 1)
{
printf("插入成功!\n");


}
else
{
printf("插入失败!\n");
}
break;
}
case 2:
{
if (deletelist(&sq) == 1)
{
printf("删除成功!\n");
}
else
printf("删除失败\n");
break;
}
case 3:
{
if (getlist(sq) == 1)
{
printf("获取成功!\n");
}
else
printf("获取失败!\n");
break;
}
case 4:
{
print(sq);
break;
}
case 5:
{
printf("欢迎下次使用!\n");
return 0;
}
}
}
}

  


二、链表

 特点
   每个元素(表项)由结点(Node)构成。
  每个结点由数据域和指针域组成

定义:typedef int ElemType;    //数据元素的类型


typedef struct Node
{    
   ElemType data; 
   struct Node *next;
}Node;                            //定义结点


typedef Node *Linklist;  //定义链表

++++++++++++

代码:

#include <stdio.h>
#include <stdlib.h>


#define OK 1
#define ERROR 0


typedef int status;
typedef struct Node
{
int data;
struct Node *next;


}node;//定义结点
typedef node* Linklist;
Linklist H;//全局变量 定义头指针;
status initlink()//初始化函数
{
Linklist p = (node*)malloc(sizeof(node));
if (p == NULL)
{
printf("申请内存失败,抛出错误\n");
return ERROR;
}
H = p;
H->data = 0;//用以记录头结点后插入多少个结点;
H->next == NULL;
return OK;
}


status insertlink()//插入函数,本函数是固定插入位子,在头结点后插入
{
int e;
printf("请输入要插入元素,以回车结束\n");
scanf("%d",&e);


Linklist p = (node*)malloc(sizeof(node));//自己开辟结点空间
if (p == NULL)
{
printf("申请内存失败,抛出错误\n");
return ERROR;
}
p->data = e;//写入数据
p->next = H->next;
H->next = p;//锁定在头结点后插入,不用遍历到最后在插入,便于操作;
H->data++;
return OK;
}


status deletelink()//删除函数
{
int pos,e;
int i = 0;
printf("请选择删除第几个结点信息!\n");
scanf("%d",&pos);
Linklist p = H;
Linklist q = NULL;
if (H->next == NULL)
{
printf("当前链表为空,无法删除!\n");
return ERROR;
}
while(p->next != NULL)
{
q = p;
p = p->next;
i++;
if (i == pos)
{
e = p->data;
break;
}
}
printf("第%d个结点信息为%d\n",pos,e);
printf("是否删除y/n\n");
char ch;
scanf("%c",&ch);
if (getchar() == 'y')//确认是否删除,安全
{
q->next = p->next;
free(p);
H->data--;//长度减1;
return OK;
}
else if (getchar() == 'n')
{
return ERROR;
}
}


status getlink()//读取函数
{
int pos,e;
int i;
printf("请选择读取第几个结点信息!\n");
scanf("%d",&pos);
Linklist p = H;
Linklist q = NULL;
if (H->next == NULL)
{
printf("当前链表为空,无法读取!\n");
return ERROR;
}
if (pos < 1 || pos > (H->data) )
{
printf("读取的位子错误\n");
return ERROR;
}
while(p->next != NULL)//移动指针到要读取的结点
{
q = p;
p = p->next;
i++;
if (i == pos)
{
e = p->data;
break;
}
}
printf("第%d个结点信息为%d\n",pos,e);
return OK;
}


void print()//打印函数
{
//int i=0;
Linklist p = H;//定义遍历指针;
if (H->data == 0)
{
printf("当前链表为空,无法打印!\n");
return;
}
while(p->next != NULL)
{
p = p->next;
printf("%2d",p->data );
}
printf("\n");
return;
}

++++++++++

主函数

int main()
{
int sel;
initlink();
printf("欢迎使用链表!\n");
while(1)
{
printf("\t\t菜单:\n");
printf("\t\t1、插入\n");
printf("\t\t2、删除\n");
printf("\t\t3、读取\n");
printf("\t\t4、打印\n");
printf("\t\t0、退出\n");
scanf("%d",&sel);
switch(sel)
{
case 1:
{
if (insertlink() == 1)
{
printf("插入成功!\n");
}
else
printf("插入失败!\n");
break;
}
case 2:
{
if (deletelink() == 1)
{
printf("删除成功!\n");
}
else
printf("删除失败!\n");
break;
}
case 3:
{
getlink();
break;
}
case 4:
{
print();
break;
}
case 0:
{
printf("欢迎下次使用!谢谢\n");
return 0;
}
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值