数据结构之顺序表和单链表的实现-C语言版
一、顺序表
1.顺序表的创建
void CREATE(SqList *L)
{
int i;
printf("请输入学生的个数:");
scanf("%d",&L->length);
for(i=0;i<L->length;i++)
{
printf("第%d个学生信息:\n",i+1);
printf("学号:");
scanf("%d",&L->stu[i].stu_num);
printf("姓名:");
scanf("%s",L->stu[i].name);
}
printf("OK");
}
2.顺序表查找
void LOCATE(SqList L)
{
int i=0;
int number;
printf("\n请输入要查找学生的学号:");
scanf("%d",&number);
while(i<=L.length-1 && L.stu[i].stu_num!=number)
i++;
if(i<=L.length-1)
printf("学生位置为:%d",i+1);
else
printf("学生信息不存在!");
}
3.顺序表的插入
void INSERT(SqList *L)
{
int i,j;
Data e;
printf("\n请输入插入位置(1<=n<=%d):",L->length+1);
scanf("%d",&i);
if(L->length==MAXSIZE)
printf("数据已满!\n");
else if
(i<1||i>L->length +1)
printf("输入位置错误!\n");
else
{
{
printf("学号:");
scanf("%d",&e.stu_num);
printf("姓名:");
scanf("%s",e.name);
}
for(j=L->length-1;j>=i-1;j--)
L->stu[j+1] = L->stu[j];
L->stu[i-1] = e;
L->length++;
}
printf("\nOK\n");
}
4.顺序表的删除
void DELETE(SqList *L)
{
int i,j;
Data elem;
printf("\n请输入要删除的元素的位置(1<=n<=%d):",L->length);
scanf("%d",&i);
if (L->length==0)
printf("空表!\n");
else if(i<1||i>L->length)
printf("输入位置错误!\n");
else
{
elem = L->stu[i-1];
for(j=i;j<=L->length-1;j++)
L->stu[j-1] = L->stu[j];
L->length--;
}
printf("OK");
}
5.顺序表的显示
void PRINT(SqList L)
{
int i;
printf("学号\t\t姓名\n");
for(i=0;i<L.length;i++)
printf("%d\t\t%s\n",L.stu[i].stu_num,L.stu[i].name);
}
6.代码补全
#include
#include
#define MAXSIZE 100
struct Data
{
char name[10];
int stu_num;
};
typedef struct
{
int length;
Data stu[MAXSIZE];
}SqList;
void MENU_PRINT();
void CREATE(SqList *L);
void INSERT(SqList *L);
void PRINT(SqList L);
void DELETE(SqList *L);
void LOCATE(SqList L);
void main()
{
SqList Stu_Data;
while(1)
{
int k;
MENU_PRINT();
scanf("%d",&k);
switch(k)
{
case 0:exit(0);break;
case 1:CREATE(&Stu_Data);break;
case 2:INSERT(&Stu_Data);break;
case 3:DELETE(&Stu_Data);break;
case 4:LOCATE(Stu_Data);break;
case 5:PRINT(Stu_Data);
};
}
}
void MENU_PRINT()
{
printf("\n******************
\n* 1.创建顺序表 *
\n* 2.插入元素 *
\n* 3.删除元素 *
\n* 4.查找元素 *
\n* 5.显示顺序表 *
\n* 0.结束程序运行*
\n* 请输入您的选择 *
\n******************
\n>>>");
}
7.运行结果
二、单链表
1.单链表的初始化和创建
void Status_InitList(LinkList L)
{
L = (LNode*) malloc(sizeof(LNode));
L->next = NULL;
printf("成功分配存储空间!\n");
}
void CreateList_H(LinkList *Li,int n)
{
int i;
LNode *p = NULL;
{
*Li = (LNode*) malloc(sizeof(LNode));
(*Li)->next = NULL;
printf("单链表初始化成功!\n……\n");
}
for(i=n;i>0;i--)
{
p = (LNode*) malloc(sizeof(LNode));
printf("请输入链表元素%d:",i);
scanf("%d",&p->data);
p->next = (*Li)->next;
(*Li)->next = p;
}
printf("单链表创建成功!\n……\n");
}
2.单链表的取值
void Status_GetElem(LinkList L,int i)
{
int j = 1;
LNode *p;
p = L->next;
while(p && j<i)
{
p = p->next;
++j;
}
if(!p || j>i)
printf("位置有误!\n");
else
printf("取值成功!该值为:%d\n",p->data);
}
3.单链表的查找
void LocateElem(LinkList L,int e)
{
int i = 1;
LNode *p = NULL;
p = L->next;
while(p && p->data!=e)
{
p = p->next;
i++;
}
if(i>4 || p->data!=e)
printf("元素不存在!\n");
else
printf("该元素位置为:%d\n",i);
}
4.单链表的插入
void Status_ListInsert(LinkList *Li,int i,int e)
{
LinkList s;
LNode *p = NULL;
int j;
p = *Li;
j = 0;
while(p && (j<i-1))
{
p = p->next;
++j;
}
if(!p||j>i-1)
printf("输入位置错误!\n");
else
{
s = (LNode*) malloc(sizeof(LNode));
s->data = e;
s->next = p->next;
p->next = s;
printf("元素插入成功!\n");
}
}
5.单链表的删除
void Status_ListDelete(LinkList *Li,int i)
{
LNode *p = NULL,*q = NULL;
int j;
p = *Li;
j = 0;
while((p->next) && (j<i-1))
{
p = p->next;
++j;
}
if(!(p->next)||(j>i-1))
printf("删除位置不合理!\n");
else
{
q = p->next;
p->next = q->next;
free(q);
printf("删除成功!\n");
}
}
6.单链表的显示
void Print_List(LinkList L)
{
LNode *p = NULL;
p = L->next;
printf("链表元素为:");
while(p)
{
printf("%d,",p->data);
p = p->next;
}
printf("\n");
}
7.代码补全
#include
#include
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void Status_InitList(LinkList L);
void Status_GetElem(LinkList L,int i);
void LocateElem(LinkList L,int e);
void Status_ListInsert(LinkList *Li,int i,int e);
void Status_ListDelete(LinkList *L,int i);
void CreateList_H(LinkList *Li,int n);
void Print_List(LinkList L);
int Link_Length(LinkList L);
void Print_Menu();
void main()
{
int i,n = 4,e,user;
LinkList L = NULL;
LinkList *Li = &L;
CreateList_H(Li,n);
while(1)
{
Print_Menu();
scanf("%d",&user);
if(user>5 || user<0)
printf("输入选项有误!");
else
switch(user)
{
case 1:{
printf("请输入取值位置(0-4):");
scanf("%d",&i);
Status_GetElem(L,i);
break;
}
case 2:{
printf("请输入要查找的元素:");
scanf("%d",&e);
LocateElem(L,e);
break;
}
case 3:{
printf("请输入要插入的元素:");
scanf("%d",&e);
printf("请输入要插入的位置(1-%d):",Link_Length(L)+1);
scanf("%d",&i);
Status_ListInsert(Li,i,e);
break;
}
case 4:{
printf("请输入要删除的元素位置(1-%d):",Link_Length(L));
scanf("%d",&i);
Status_ListDelete(Li,i);
break;
}
case 5:Print_List(L);break;
case 0:exit(0);
};
}
}
void Print_Menu()
{
printf("\n**********************
\n 1.单链表取值
\n 2.单链表查找
\n 3.单链表插入
\n 4.单链表删除
\n 5.显示单链表
\n 0.退出
\n(请输入序号0-5)
\n**********************
\n>>>");
}
int Link_Length(LinkList L)
{
int i = 0;
LNode *p = NULL;
p = L->next;
while(p)
{
p = p->next;
i++;
}
return i;
}
8.运行结果