#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LENGTH 10
typedef struct Elemtype
{
char *name;
char *number;
int age;
}Elemtype;
typedef struct
{
Elemtype *elem;
int cnt;
int length;
}Lnode_sq, *List_sq;
typedef struct Lnode_link
{
Elemtype *elem;
struct Lnode_link *pnext;
}Lnode_link,*List_link;
Lnode_sq P_List_sq;
Lnode_link Link_List;
Status is_empty_Listsq(List_sq List_sq)
{
if(List_sq->cnt == 0)
return TRUE;
else
return FALSE;
}
Status is_full_Listsq(List_sq List_sq)
{
if(List_sq->length == List_sq->cnt)
return TRUE;
else
return FALSE;
}
Status Init_List_sq(List_sq L, int length)
{
L->elem = (Elemtype *)malloc(sizeof(Elemtype)*length);
if(L->elem == NULL)
exit(OVERFLOW);
else
{
L->length = length;
L->cnt = 0;
return OK;
}
}
Status List_Sq_length(List_sq List_sq)
{
return List_sq->cnt;
}
Status Get_List_sq(List_sq List_sq, int pos, Elemtype *elem)
{
if(is_empty_Listsq(List_sq))
{
return ERROR;
}
if(pos<1||pos>List_sq->cnt)
{
return ERROR;
}
// elem->name = (char *)malloc(sizeof(char)*LENGTH);
//elem->number = (char *)malloc(sizeof(char)* LENGTH);
{
elem->name = List_sq->elem[pos-1].name;
elem->number = List_sq->elem[pos-1].number;
elem->age = List_sq->elem[pos-1].age;
return OK;
}
}
Status Locate_List_sq(List_sq List_sq, char **name)
{
if(is_empty_Listsq(List_sq))
{
return ERROR;
}
else
{
for(int i=0; i<List_sq->cnt; i++)
{
if(strcmp(List_sq->elem[i].name,*name) == 0)
{
return i+1;
}
}
return ERROR;
}
}
Status Insert_List_sq(List_sq List_sq, int pos, Elemtype *elem)
{
if(is_full_Listsq(List_sq))
{
return ERROR;
}
if(pos<1||pos>List_sq->cnt+1)
{
return ERROR;
}
elem->name = (char *)malloc(sizeof(char)*20);
elem->number = (char *)malloc(sizeof(char)*20);
printf("请输入你要插入元素的名字:");
scanf("%s",elem->name);
printf("请输入你要插入元素的学号: ");
scanf("%s",elem->number);
printf("请输入你要插入元素的年龄: ");
scanf("%d",&elem->age);
if(pos<List_sq->cnt+1)
{
for(int i=List_sq->cnt-1;i>=pos-1;i--)
{
List_sq->elem[i+1].name = List_sq->elem[i].name;
List_sq->elem[i+1].number = List_sq->elem[i].number;
List_sq->elem[i+1].age = List_sq->elem[i].age;
}
}
List_sq->elem[pos-1].name = elem->name;
List_sq->elem[pos-1].number =elem->number;
List_sq->elem[pos-1].age = elem->age;
List_sq->cnt++;
return OK;
}
Status Delete_Listsq(List_sq List_sq, int pos, Elemtype *elem)
{
if(is_empty_Listsq(List_sq))
{
return ERROR;
}
if(pos<1||pos>List_sq->cnt)
{
return ERROR;
}
elem->name = List_sq->elem[pos-1].name;
elem->number = List_sq->elem[pos-1].number;
elem->age = List_sq->elem[pos-1].age;
if(pos<List_sq->cnt)
{
for(int i=pos; i<List_sq->cnt;i++)
{
List_sq->elem[i-1].name = List_sq->elem[i].name;
List_sq->elem[i-1].number = List_sq->elem[i].number;
List_sq->elem[i-1].age = List_sq->elem[i].age;
}
}
List_sq->cnt--;
return OK;
}
Status Traverse_Listsq(List_sq List_sq)
{
if(is_empty_Listsq(List_sq))
{
return ERROR;
}
else
{
for(int i=0;i<List_sq->cnt;i++)
{
printf("\t\t\t\t\t\t %s ",List_sq->elem[i].name);
printf("\t\t\t\t\t\t %s ",List_sq->elem[i].number);
printf("\t\t\t\t\t\t %d ",List_sq->elem[i].age);
printf("\n");
}
}
return OK;
}
void p1(void)
{
int status;
status = Init_List_sq(&P_List_sq,LENGTH);
if(status == OVERFLOW)
{
system("cls");
printf("\t\t\t\t\t\t线性表创建失败!\n");
printf("\t\t\t\t");
system("pause");
}
else
{
system("cls");
printf("线性表创建成功!\n");
printf("\t\t\t\t\t");
system("pause");
}
}
void p2(void)
{
int length;
length = List_Sq_length(&P_List_sq);
system("cls");
printf("\t\t\t\t\t\t顺序线性表的长度为: %d\n",length);
printf("\t\t\t\t");
system("pause");
}
void p3(void)
{
int pos,status;
Elemtype elem3;
// elem->name = (char *)malloc(20);
// elem->number = (char *)malloc(20);
system("cls");
switch(P_List_sq.cnt)
{
case 0:
printf("\t\t\t\t\t顺序表长度为0无法取值,请先插入元素!\n");
printf("\t\t\t\t\t");
system("pause");
break;
default:
printf("\t\t\t\t请输入你要获取的元素的位置: ");
scanf("%d",&pos);
status = Get_List_sq(&P_List_sq,pos,&elem3);
if(status == ERROR)
{
printf("所输入位置的元素不存在!\n");
printf("\t\t\t\t");
system("pause");
}
else
{
printf("\t\t\t\t所输入位置元素的名字为: %s\n",elem3.name);
printf("\t\t\t\t所输入位置元素的学号为: %s\n",elem3.number);
printf("\t\t\t\t所输入位置元素的年龄为: %d\n",elem3.age);
printf("\t\t\t\t");
system("pause");
}
break;
}
}
void p4(void)
{
char *name;
int status;
name = (char *)malloc(sizeof(char)*LENGTH);
system("cls");
switch(P_List_sq.cnt)
{
case 0:
printf("\t\t\t\t\t\t顺序表长度为空无法查找,请先插入元素!\n");
printf("\t\t\t\t\t");
system("pause");
break;
default:
printf("\t\t\t\t\t请输入你要查找元素的姓名:");
scanf("%s",name);
printf("%s",name);
status = Locate_List_sq(&P_List_sq,&name);
if(status == ERROR)
{
printf("\t\t\t\t不存在该姓名的元素!\n");
printf("\t\t\t\t");
system("pause");
}
else
{
printf("\t\t\t第一个为该姓名的元素位置为%d\n",status);
printf("\t\t\t\t");
system("pause");
}
}
}
void p5(void)
{
system("cls");
int status,pos;
Elemtype elem;
printf("\t\t\t\t\t请输入你要插入的位置:");
scanf("%d",&pos);
status = Insert_List_sq(&P_List_sq,pos,&elem);
if(status == ERROR)
{
printf("\t\t\t\t\t顺序表中元素已满或者你输入的插入位置不合法\n");
printf("\t\t\t\t\t\t");
system("pause");
}
else
{
printf("\t\t\t\t\t插入成功!\n");
printf("\t\t\t\t\t\t");
system("pause");
}
}
void p6(void)
{
char *name;
int a;
int pos;
Elemtype elem;
name = (char *)malloc(sizeof(char) * LENGTH);
elem.name = (char *)malloc(sizeof(char) * LENGTH);
elem.number = (char *)malloc(sizeof(char) * LENGTH);
system("cls");
printf("\t\t\t\t\t\t请输入你的选择(1:位置删除, 2:姓名删除)");
scanf("%d",&a);
// system("cls");
if(a == 1)
{
printf("\n");
printf("\t\t\t\t\t\t请输入你要删除的元素的位置:");
scanf("%d",&pos);
Delete_Listsq(&P_List_sq,pos,&elem);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
printf("\t\t\t\t\t\t删除成功!\n");
}
if(a == 2)
{
printf("\n");
printf("\t\t\t\t\t\t请输入你要删除的元素的姓名:");
scanf("%s",name);
pos = Locate_List_sq(&P_List_sq,&name);
if(pos == ERROR)
{
printf("\t\t\t\t\t\t你要删除的姓名为%s的元素不存在!\n",name);
printf("\t\t\t\t\t\t删除失败!\n");
}
else
{
printf("\t\t\t\t\t\t你要删除的姓名为%s的元素的位置为%d\n",name,pos);
Delete_Listsq(&P_List_sq,pos,&elem);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
printf("\t\t\t\t\t\t删除成功!\n");
}
}
//printf("\t\t\t\t\t插入成功!\n");
printf("\t\t\t\t\t\t");
system("pause");
}
void p7(void)
{
system("cls");
if(is_empty_Listsq(&P_List_sq))
{
printf("\t\t\t\t\t\t\t顺序表中无元素,无法输出!\n");
}
else
{
printf("\t\t\t\t\t\t\t顺序表中的元素输出如下: \n");
Traverse_Listsq(&P_List_sq);
}
printf("\t\t\t\t\t\t");
system("pause");
}
void list_sq_show(void)
{
int b;
while(1)
{
system("cls");
printf("\t\t\t\t\t\t\t\t1: 创建顺序线性表\n");
printf("\t\t\t\t\t\t\t\t2: 求顺序线性表的长度\n");
printf("\t\t\t\t\t\t\t\t3: 按序号取顺序表元素\n");
printf("\t\t\t\t\t\t\t\t4: 按值查找顺序表\n");
printf("\t\t\t\t\t\t\t\t5: 插入元素\n");
printf("\t\t\t\t\t\t\t\t6: 删除元素\n");
printf("\t\t\t\t\t\t\t\t7: 输出顺序线性表\n");
printf("\t\t\t\t\t\t\t\t8: 返回\n");
printf("\t\t\t\t\t\t\t\t请输入你的选择: ");
scanf("%d",&b);
if(b == 8)
{
break;
}
else
{
switch(b)
{
case 1:p1(); break;
case 2:p2(); break;
case 3:p3(); break;
case 4:p4(); break;
case 5:p5(); break;
case 6:p6(); break;
case 7:p7(); break;
default:
printf("\t\t\t\t输入错误\n");
printf("\t\t\t\t");
system("pause");
break;
}
}
}
}
Status is_empty_link(List_link Link_List)
{
if(Link_List->pnext == NULL)
{
return TRUE;
}
else
{
return FALSE;
}
}
Status init_List_lk(List_link Link_List)
{
Link_List = (List_link )malloc(sizeof(Lnode_link));
if(Link_List == NULL)
{
return ERROR;
}
else
{
Link_List->pnext = NULL;
return OK;
}
}
Status LkList_Length(List_link Link_List)
{
int j=0;
List_link p = Link_List->pnext;
while(p)
{
p=p->pnext;
++j;
}
return j;
}
Status Get_elem_Lklist(List_link Link_List, int pos, Elemtype *elem)
{
List_link p=Link_List->pnext;
int j=1;
while(p&&j<pos)
{
p=p->pnext;
j++;
}
if(!p||j>pos)
{
return ERROR;
}
elem->name = p->elem->name;
elem->number = p->elem->number;
elem->age = p->elem->age;
return OK;
}
Status Locate_List_lk(List_link Link_List, char **name)
{
List_link p = Link_List->pnext;
int j=1;
while(p&&(strcmp(p->elem->name,*name)!=0))
{
p=p->pnext;
j++;
}
if(!p)
{
return ERROR;
}
else
{
return j;
}
}
Status Insert_Listlk(List_link Link_List, int pos, Elemtype *elem)
{
List_link p = Link_List;
List_link s;
int j = 0;
while(p&&(j<pos-1))
{
p=p->pnext;
++j;
}
if(!p||j>pos-1)
{
return ERROR;
}
elem->name = (char *)malloc(sizeof(char) * LENGTH);
elem->number = (char *)malloc(sizeof(char) * LENGTH);
s = (List_link)malloc(sizeof(Lnode_link));
s->elem = (Elemtype *)malloc(sizeof(Elemtype));
s->elem->name = (char *)malloc(sizeof(char) * LENGTH);
s->elem->number = (char *)malloc(sizeof(char) * LENGTH);
printf("请输入你要插入元素的姓名:");
scanf("%s",elem->name);
printf("请输入你要插入元素的学号: ");
scanf("%s",elem->number);
printf("请输入你要插入元素的年龄: ");
scanf("%d",&elem->age);
s->elem->name = elem->name;
s->elem->number = elem->number;
s->elem->age = elem->age;
s->pnext = p->pnext;
p->pnext = s;
return OK;
}
Status Delete_LkList(List_link Link_List, int pos, Elemtype *elem)
{
List_link p=Link_List;
List_link q;
int j=0;
while((p->pnext)&&(j<pos-1))
{
p=p->pnext;
++j;
}
if(!(p->pnext)||(j>pos-1))
{
return ERROR;
}
q = p->pnext;
elem->name = q->elem->name;
elem->number = q->elem->number;
elem->age = q->elem->age;
p->pnext = q->pnext;
free(q);
q = NULL;
return OK;
}
Status Traverse_LkList(List_link Link_List)
{
List_link p=Link_List->pnext;
while(p)
{
printf("\t\t\t\t %s\t\t\t\t%s\t\t\t\t%d\n",p->elem->name,p->elem->number,p->elem->age);
p = p->pnext;
}
return OK;
}
void q1(void)
{
int status;
status = init_List_lk(&Link_List);
if(status == ERROR)
{
system("cls");
printf("\t\t\t\t\t\t链式线性表创建失败!\n");
printf("\t\t\t\t");
system("pause");
}
else
{
system("cls");
printf("链式线性表创建成功!\n");
printf("\t\t\t\t\t");
system("pause");
}
}
void q2(void)
{
int length;
length = LkList_Length(&Link_List);
system("cls");
printf("\t\t\t\t\t\t链式线性表的长度为: %d\n",length);
printf("\t\t\t\t");
system("pause");
}
void q3(void)
{
int pos,status;
Elemtype elem;
system("cls");
printf("\t\t\t\t\t\t请输入你要获取链表元素的位置: ");
scanf("%d",&pos);
status = Get_elem_Lklist(&Link_List,pos,&elem);
if(status == ERROR)
{
printf("\t\t\t\t\t\t你输入的位置不合法!\n");
}
else
{
printf("\t\t\t\t\t\t你输入位置的元素的姓名为: %s\n", elem.name);
printf("\t\t\t\t\t\t你输入位置的元素的学号为: %s\n", elem.number);
printf("\t\t\t\t\t\t你输入位置的元素的年龄为: %d\n", elem.age);
}
printf("\t\t\t\t\t\t\t");
system("pause");
}
void q4(void)
{
char *name;
Elemtype elem;
int pos;
system("cls");
printf("请输入你要查找元素的姓名: ");
scanf("%s",name);
pos = Locate_List_lk(&Link_List, &name);
if(pos == ERROR)
{
printf("\t\t\t\t\t\t链式顺序表中没有你输入姓名的元素!\n");
}
else
{
Get_elem_Lklist(&Link_List,pos,&elem);
printf("\t\t\t\t\t\t你要获取的姓名为%s的元素位置是%d\n",name,pos);
printf("\t\t\t\t\t\t你要获取的姓名为%s的元素学号是%s\n",name,elem.number);
printf("\t\t\t\t\t\t你要获取的姓名为%s的元素年龄是%d\n",name,elem.age);
}
printf("\t\t\t\t\t\t\t\t");
system("pause");
}
void q5(void)
{
system("cls");
int status,pos;
Elemtype elem;
printf("\t\t\t\t\t请输入你要插入的位置:");
scanf("%d",&pos);
status = Insert_Listlk(&Link_List,pos,&elem);
if(status == ERROR)
{
printf("\t\t\t\t\t你输入的插入位置不合法\n");
printf("\t\t\t\t\t\t");
system("pause");
}
else
{
printf("\t\t\t\t\t插入成功!\n");
printf("\t\t\t\t\t\t");
system("pause");
}
}
void q6(void)
{
int a,status,pos;
char *name;
Elemtype elem;
name = (char *)malloc(sizeof(char) * LENGTH);
elem.name = (char *)malloc(sizeof(char *) * LENGTH);
elem.number = (char *)malloc(sizeof(char *) * LENGTH);
system("cls");
printf("请输入你的选择(1-2)1:位置删除, 2:姓名删除: ");
scanf("%d",&a);
if(a == 1)
{
printf("\n");
printf("\t\t\t\t\t\t请输入你要删除的元素的位置:");
scanf("%d",&pos);
status = Delete_LkList(&Link_List,pos,&elem);
if(status == ERROR)
{
printf("\t\t\t\t\t\t你要删除的位置不合法!\n");
}
else
{
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
printf("\t\t\t\t\t\t删除成功!\n");
}
}
if(a ==2)
{
printf("\n");
printf("\t\t\t\t\t\t请输入你要删除的元素的姓名:");
scanf("%s",name);
pos = Locate_List_lk(&Link_List,&name);
if(pos == ERROR)
{
printf("\t\t\t\t\t\t你要删除的姓名为%s的元素不存在!\n",name);
printf("\t\t\t\t\t\t删除失败!\n");
}
else
{
printf("\t\t\t\t\t\t你要删除的姓名为%s的元素的位置为%d\n",name,pos);
Delete_LkList(&Link_List,pos,&elem);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的姓名为:%s\n",pos,elem.name);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的学号为:%s\n",pos,elem.number);
printf("\t\t\t\t\t\t你删除的第%d个位置的元素的年龄为:%d\n",pos,elem.age);
printf("\t\t\t\t\t\t删除成功!\n");
}
}
printf("\t\t\t\t\t\t\t");
system("pause");
}
void q7(void)
{
system("cls");
if(is_empty_link(&Link_List) == TRUE)
{
printf("\t\t\t\t\t\t链式顺序表为空,无法输出!\n");
}
else
{
printf("\t\t\t\t\t\t\t顺序表中的元素输出如下: \n");
Traverse_LkList(&Link_List);
}
printf("\t\t\t\t\t\t");
system("pause");
}
void list_link_show(void)
{
int c;
while (1)
{
system("cls");
printf("\t\t\t\t\t\t\t\t\t1: 创建链式线性表\n");
printf("\t\t\t\t\t\t\t\t\t2: 求链式线性表的长度\n");
printf("\t\t\t\t\t\t\t\t\t3: 按序号取链表元素\n");
printf("\t\t\t\t\t\t\t\t\t4: 按值查找链表元素\n");
printf("\t\t\t\t\t\t\t\t\t5: 插入元素\n");
printf("\t\t\t\t\t\t\t\t\t6: 删除元素\n");
printf("\t\t\t\t\t\t\t\t\t7: 输出链式线性表\n");
printf("\t\t\t\t\t\t\t\t\t8: 返回\n");
printf("\t\t\t\t\t\t\t请输入你的选择: ");
scanf("%d",&c);
if(c == 8)
break;
else
{
switch(c)
{
case 1:q1(); break;
case 2:q2(); break;
case 3:q3(); break;
case 4:q4(); break;
case 5:q5(); break;
case 6:q6(); break;
case 7:q7(); break;
defalut: printf("\t\t\t\t输入错误\n");
printf("\t\t\t\t");
system("pause");
break;
}
}
}
}
void main_show(void)
{
int a;
while(1)
{
system("cls");
printf("\n\n\n\n\n\n\n");
printf("\t\t\t\t\t\t\t1: 顺序表\n");
printf("\t\t\t\t\t\t\t2: 链表\n");
printf("\t\t\t\t\t\t\t3: 退出\n");
printf("\t\t\t\t\t\t\t请输入你的选择(1-3): ");
scanf("%d",&a);
if(a == 1)
list_sq_show();
else if(a == 2)
list_link_show();
else if(a==3)
break;
else
{
system("cls");
printf("\t\t\t\t\t\t输入错误, 程序即将退出!\n");
break;
}
}
printf("\t\t\t\t\t\t");
}
int main(void)
{
main_show();
return 1;
}
数据结构——线性表
最新推荐文章于 2024-09-22 13:00:38 发布