线性表的基本操作:
小牛试刀:
顺序表中基本的输入、输出之查找第i个数据元素的值:
代码:
#include <stdio.h>
#define LISTSIZE 100
typedef int DateType;
typedef struct {
DateType data[LISTSIZE];
int length;
}SqlList;
void input(SqlList &L, int n)
{
printf("请输入元素:\n");
for (int i = 1; i <= n; i++)
{
scanf("%d", &L.data[i-1]);
}
L.length=n;
printf("\n");
}
void output(SqlList &L, int n)
{
for (int i = 1; i <= n; i++)
{
printf("%-3d", L.data[i-1]);
}
printf("\n");
}
void GetData(SqlList L, int i, int &a)
{
a = L.data[i - 1];
}
int main()
{
int a,num;
SqlList L;
printf("请输入插入的元素:\n");
input(L, 5);
printf("输出的元素是:\n");
output(L, 5);
printf("\n请输入需要查找的元素位置:");
scanf("%d",&num);
GetData(L, num, a);
printf("\n第 %d 个位置元素的值是:%d", num, a);
return 0;
}
效果图:
基础篇:
完成顺序表的基本操作(如输入、输出、插入操作、删除操作、查找操作等)
代码:
#include <stdio.h>
#define ListSize 100
typedef int DateType; // 把int类型定义成新的类型
typedef struct {
DateType data[ListSize];
int length;
}SeqList;
//输入函数
void input(SeqList &L) {
printf("请输入数据后按回车键确认,若想结束输入请按“#”\n");
printf("***********************************\n");
char num[20];
int sum = 0,i,b,j=0;
printf("请输入元素: ");
gets(num);
if(num[0] == '#') break;
L.length++;
}
}
//删除元素
void deleteData(SeqList &L){
printf("\n请输入删除元素的位置:");
int position;
scanf("%d",&position);
if(position<1 || position>L.length){
printf("删除位置不合法!\n");
return;
}
int number;
number=L.data[position-1];
for(int i=position;i<L.length;i++){
//空间变小,元素需要往前移位
L.data[i-1]=L.data[i];
}
L.length--;
printf("要删除的元素是%d\n",number);
}
//查找(获取)元素
void GetData(SeqList L){
int number;
printf("\n");
printf("请输入要查找的元素:");
scanf("%d",&number);
for(int i=0;i<=L.length;i++){
if(L.data[i]==number){
printf("查找成功!值为%d,位于当前顺序表的第 %d 个位置\n",number,i+1);
break;
}
}
}
//插入元素
void insertList(SeqList &L){
printf("\n请输入插入位置的元素:");
int index;
scanf("%d",&index);
if(index<1 || index>L.length+1){
printf("插入位置不合法!");
return;
}
if(L.length>=ListSize){
printf("线性表已满,无法插入元素!");
return;
}
int num;
printf("\n请输入插入的元素:");
scanf("%d",&num);
//从最后一个元素往后移
for(int k=L.length-1;k>=index-1;k--){
L.data[k+1]=L.data[k];
}
//插入元素num
L.data[index-1]=num;
L.length++;
}
// 输出函数
void output(SeqList L){
printf("\n");
printf("****遍历顺序表中的元素***\n");
for(int i = 1; i<= L.length; i++) {
printf("第%d个元素的值为 %d\n",i,L.data[i-1]);
}
}
int main(){
SeqList L;
L.length=0;
input(L);
output(L);
GetData(L);
insertList(L);
printf("\n插入后的线性表是:");
output(L);
deleteData(L);
printf("\n删除后的线性表是:");
output(L);
return 0;
}
效果图:
加强篇:
已知线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。(注:需要使用顺序表和链表分别完成)
代码:
#include <stdio.h>
#define ListSize 100
typedef int DataType;
typedef struct{
DataType data[ListSize];
int length;
}SeqList;
typedef struct Node{
DataType data;
struct Node *next;
}Node,*LinkList;
//顺序表输入
void input_Seqlist(SeqList &L){
printf("请输入数据总量:");
int num;
scanf("%d",&num);
printf("请输入数据:");
int number;
for(int i=1;i<=num;i++){
scanf("%d",&number);
L.data[i-1]=number;
L.length++;
}
}
//顺序表输出
void output_Seqlist(SeqList L){
printf("\n线性表中数据是:\n");
for(int i=1;i<=L.length;i++){
printf("%d)>、%d\t\t",i,L.data[i-1]);
}
printf("\n");
}
//顺序表的合并
void mergeList1(SeqList La,SeqList Lb,SeqList &Lc){
int i=0,j=0,k=0;
while(i<=La.length-1 && j<=Lb.length-1){
if(La.data[i]<=Lb.data[j]){
Lc.data[k]=La.data[i];
i++;
k++;
}else{
Lc.data[k]=Lb.data[j];
j++;
k++;
}
}
while(i<=La.length-1){
Lc.data[k]=La.data[i];
i++;k++;
}
while(j<=Lb.length-1){
Lc.data[k]=La.data[j];
j++;k++;
}
Lc.length=La.length+Lb.length;
}
//使用链表输入
void input_Link(LinkList &L){
int nums,i=1;
printf("请输入数据总量:");
int num;
scanf("%d",&num);
L=new Node;
Node *s,*r=L;
printf("请输入数据元素:");
while(i<=num){
scanf("%d",&nums);
s=new Node;
s->data=nums;
r->next=s;
r=s;
i++;
}
r->next=NULL;
}
//使用链表输出
void ouput_Link(LinkList L){
int i=1;
Node *p;
p=L->next;
while(p!=NULL){
printf("%d)--->%d\t\t",i,p->data);
p=p->next;
i++;
}
printf("\n");
}
//使用链表合并
void mergeList2(LinkList LA,LinkList LB,LinkList &LC){
Node *pa,*pb,*pc;
pa=LA->next;
pb=LB->next;
LC=LA;
pc=LC;
while(pa!=NULL && pb!=NULL){
if(pa->data<=pb->data){
pc->next=pa;
pc=pa;
pa=pa->next;
}else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
if(pa){
pc->next=pa;
}else{
pc->next=pb;
}
delete LB;
}
//主函数
int main(){
//初始化
SeqList La,Lb,Lc;
La.length=0;
Lb.length=0;
Lc.length=0;
LinkList LA,LB,LC;
LA=NULL;
LB=NULL;
LC=NULL;
printf("1、使用链表合并\n2、使用顺序表合并\n3、退出程序\n");
int number;
scanf("%d",&number);
if(number==1){
//1、链表合并
printf("\n请输入第一个升序排列的链表ListA\n");
input_Link(LA);
ouput_Link(LA);
printf("\n请输入第二个升序排列的链表ListB\n");
input_Link(LB);
ouput_Link(LB);
mergeList2(LA,LB,LC);
printf("\n使用链表合并成功!\n");
ouput_Link(LC);
}else if(number==2){
//2、顺序表合并
printf("\n请输入第一个升序排列的线性表ListA\n");
input_Seqlist(La);
output_Seqlist(La);
printf("\n请输入第二个升序排列的线性表ListB\n");
input_Seqlist(Lb);
output_Seqlist(Lb);
mergeList1(La,Lb,Lc);
printf("\n使用线性表合并成功!\n");
output_Seqlist(Lc);
printf("SeqListC线性表的长度是:%d",Lc.length);
}else{
printf("退出程序!!!\n");
}
return 0;
}
效果图:
提高篇:
为方便管理个人通讯录系统,编写一个简单的通讯录管理系统,系统记录必须有姓名、电话号码、QQ号。
扫描二维码关注公众号,回复:
15674969 查看本文章
需要完成的功能如下:
- 输入信息:调用此函数用以输入数据到内存中,此过程包括建立相应的链表或相应的数组,便于读取
- 显示信息:用以显示输入的数据
- 查找:以姓名作为关键字查找要找的信息
- 删除信息:用以删除选定的输入信息(姓名作为关键字)
- 修改信息:用以修改选定的输入信息(姓名作为关键字)
- 打开通讯录:存储从文件中读取的字符
- 添加信息:用尾插法以添加信息
- 保存:调用此函数将内存中的数据保存至磁盘中
- 清屏:执行cls命令
改进中......
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Student{
char name[20]; //姓名
char telephone[20]; //电话号码
int qq[20]; //QQ号
struct Student *next;
}Node;
Node *head;//头指针
//初始化系统界面
void screnn(){
printf("==========欢迎来到个人通讯录管理系统!==========\n");
printf(" 1.输入信息 2.显示信息\n");
printf(" 3.查找信息 4.删除信息\n");
printf(" 5.修改信息 6.添加信息\n");
printf(" 7.保存通讯录 8.显示系统界面\n");
printf(" 9.清屏cls\n");
printf("\n===============输入0退出程序===============\n");
}
// 1 输入信息
void enter()
{
int ans; // 判断是否继续输入
Node *p1, *p2;
p1 =new Node; // 申请内存来用
if (p1 != NULL)
{
printf("========输入数据========\n");
head = p1;
while (1)
{
printf("姓名:");
scanf("%s", &p1->name);
printf("电话号码:");
scanf("%s", &p1->telephone);
printf("QQ号码:");
scanf("%s", &p1->qq);
printf("\n\n");
p2 = p1;
// 申请下一个要用的空间
p1 = new Node;
if (p1 != NULL)
p2->next = p1;
//用户选择
printf("请选择是否继续输入:1.继续 2.退出\n请选择:");
scanf("%d", &ans);
if (ans == 1)
continue;
else
{ //退出
printf("\n========输入完成========\n\n");
p2->next = NULL;
//将申请的的无用内存释放
delete(p1);
break;
}
}
}
}
主函数:
int main(){
//显示通讯录系统界面
screnn();
int numbers;
while(1){
printf("请输入你的选择(1~9):");
scanf("%d",&numbers);
printf("\n");
if(numbers<0 || numbers>9){
printf("输入有误!");
continue;
}
switch(numbers){
case 0:
printf("\n==========欢迎你再次使用个人通讯录管理系统!==========\n");
//退出系统
exit(1);
break;
case 1:
//1输入信息
enter();
break;
case 2:
//2显示信息
display(head);
break;
case 3:
//3查找信息
search(head);
break;
case 4:
//4删除信息
deleted();
break;
case 5:
//5修改信息
update(head);
break;
case 6:
//6添加信息
insert();
break;
case 7:
//7保存通讯录
save(head);
break;
case 8:
//显示通讯录系统界面
screnn();
break;
case 9:
//8清屏
cls();
break;
default:
printf("输入有误!请重新输入!");
break;
}
}
return 0;
}
效果图:
有问题可以随时联系小编!