今天老师对数据结构进行了少有的详细讲  由此可见这个知识点是多么的重要  也是因为上课的时候听的晕晕乎乎的  所以下课的时候回头再细细的看看  把当时所有的方法都写了个实例 以后再看看 所以就把每个方法都分开  各位前辈也对这篇文章进行了点评  当时因为对链表和线性的的定义不熟所以有点错误  但是我查了下资料感觉线性表与链表之间只是实现的方式不同  而动态数组是实现线性表的一种方式 而不能说动态数组就是一种线性表 现在正在学习线性链表 还有很多不足之处  还希望各位前辈多多指教

下面是当时写的代码:

 定义:

代码
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <malloc.h>
4 #include <string.h>
5
6  //定义联系人结构体
7  typedef struct _list
8 {
9 char name[9]; //联系人姓名
10   char phone[10]; //联系人电话
11  }List;
12
13  //定义线性表的结构体
14  typedef struct _Sqlist
15 {
16 List *elem; //存放联系人起始地址
17   int length; //存放该联系人的数量
18   int maxSize; //存放联系人的最大数量
19  }SqList;

初始化线性表:

 

初始化线性表
1 //初始化线性表
2  SqList* InitList(int maxSize)
3 {
4 //分配线性表内存空间
5 SqList *head=NULL;
6 head=(SqList *)malloc(sizeof(SqList));
7 if(head==NULL)
8 return NULL;
9
10 //分配联系人地址
11 head->elem=(List *)malloc(maxSize*sizeof(List));
12 if(head->elem==NULL)
13 return NULL;
14
15 //当前联系人数量
16 head->length=0;
17 head->maxSize=maxSize;
18
19 return head;
20 }

释放空间

 

释放线性表内存空间
1 //释放线性表内存空间
2 void DestroyList(SqList *ls)
3 {
4 //判断该线性表是否存在
5 if(ls==NULL)
6 return;
7
8 //判断该线性表中是否有联系人
9 if(ls->elem!=NULL)
10 {
11 free(ls->elem);
12 ls->elem=NULL;
13 ls->length=0;
14 }
15
16 //释放线性表
17 if(ls!=NULL)
18 free(ls);
19
20 }

 

新增:

 

新增联系人
1 //新增联系人
2 void AddList(SqList *ls,List *list,int i)
3 {
4 int j=0;
5 List *temp=NULL;
6 //判断list是否为空
7 if(list==NULL || ls==NULL)
8 return;
9
10 //判断是否已经满了
11 if(ls->length>=ls->maxSize)
12 return;
13
14 //判断i是否为正确位置
15 if(i<1 || i>ls->length+1)
16 {
17 return;
18 }
19
20 temp=ls->elem+i-1;
21 //插入该联系人
22 for(j=ls->length;j>i;j--)
23 {
24 *(ls->elem+j)=*(ls->elem+j-1);
25 }
26
27 memcpy(temp,list,sizeof(List));
28 ls->length++;
29 }

 

查询:

 

查询操作
1 //查询操作
2 List* FindElem(SqList* ls, int i)
3 {
4 //参数合法性检测
5 if(ls == NULL)
6 return NULL;
7
8 if(i > ls->length)
9 {
10 //查找元素位置超过当前有效元素范畴
11 printf("查找越界\n");
12 return NULL;
13 }
14 else
15 {
16 //返回了第i个元素指针 第i个元素对应的下标是i - 1
17 return ls->elem + i - 1;
18 }
19 }

修改:

 

修改信息
//修改信息
void Update(SqList *ls,int i,List *list)
{
List
*listOld=NULL;

if(list==NULL)
return;
listOld
=FindElem(ls,i);
if(listOld==NULL)
return;
memcpy(listOld,list,
sizeof(List));
}

删除:

 

删除联系人
1 //删除联系人
2 void DelList(SqList *ls,int i)
3 {
4 int j=0;
5
6 if(ls==NULL)
7 return;
8 //判断是否已经满了
9 if(ls->length<=0)
10 return;
11
12 //判断i是否为正确位置
13 if(i<1 || i>ls->length)
14 {
15 return;
16 }
17
18
19 for(j=i;j<ls->length;j++)
20 {
21 *(ls->elem+j-1)=*(ls->elem+j);
22 }
23
24 ls->length--;
25 }

打印:

 

打印单个、全部
//打印单个
void PrintElem(List *list)
{
if(list==NULL)
return;
printf(
"%8s %13s\n",list->name,list->phone);
}

//打印全部
void PrintAllElem(SqList *ls)
{
int i=0;
if(ls==NULL)
return;
if(ls->elem==NULL ||ls->length==0)
return;
for(;i<ls->length;i++)
{
PrintElem(ls
->elem+i);
}
}

置空,查找:

联系人置空、查找联系人
1 //联系人置空
2 void ClearList(SqList *ls)
3 {
4 if(ls==NULL)
5 return;
6 ls->length=0;
7 }
8
9 //查找联系人
10 List* FindList(SqList *ls,int i)
11 {
12 //判断ls的合法
13 if(ls==NULL)
14 return NULL;
15
16 //判断i
17 if(i<0)
18 {
19 printf("请输入大于0的整数");
20 return NULL;
21 }
22 if(i>ls->length)
23 {
24 printf("请输入小于有效联系人数量");
25 return NULL;
26 }
27
28 return ls->elem+i-1;
29 }
30

Main():

主函数
1 int main()
2 {
3 int flag=1; //判断结束
4 int operate; //操作数
5 int site; //要删除的位置
6 List temp;
7 //初始化线性表
8 SqList *head=NULL;
9 head=InitList(100);
10 if(head==NULL)
11 return 1;
12 //线性表的相关操作
13 while(flag)
14 {
15 printf("\n1.插入联系人\t2.删除联系人\t3.修改联系人\t4.遍历所有\t5.清屏\t6.退出\n请选择要执行的操作:");
16 scanf("%d",&operate);
17 printf("\n");
18 switch (operate)
19 {
20 case 1:
21 printf("请输入联系人的姓名:");
22 scanf("%s",&temp.name);
23 printf("\n");
24 printf("请输入联系人的电话:");
25 scanf("%s",&temp.phone);
26 printf("\n");
27 AddList(head,&temp,head->length+1);
28 printf("%8s %13s\n","姓名","电话");
29 PrintAllElem(head);
30 break;
31 case 2:
32 printf("请输入删除第几个联系人:");
33 scanf("%d",&site);
34 printf("\n");
35 DelList(head,site);
36 printf("%8s %13s\n","姓名","电话");
37 PrintAllElem(head);
38 break;
39 case 3:
40 printf("请输入删除第几个联系人:");
41 scanf("%d",&site);
42 printf("\n");
43 printf("请输入联系人的新姓名:");
44 scanf("%s",&temp.name);
45 printf("\n");
46 printf("请输入联系人的新电话:");
47 scanf("%s",&temp.phone);
48 printf("\n");
49 Update(head,site,&temp);
50 printf("%8s %13s\n","姓名","电话");
51 PrintAllElem(head);
52 break;
53 case 4:
54 printf("%8s %13s\n","姓名","电话");
55 PrintAllElem(head);
56 break;
57 case 5:
58 system("cls");
59 break;
60 case 6:
61 flag=0;
62 break;
63 default:
64 printf("请输入正确的操作\n");
65 }
66 }
67
68 //释放线性表
69 DestroyList(head);
70 system("pause");
71 return 0;
72 }

 

作者: 雨宏 发表于 2010-12-06 20:54 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"