首页 > 代码库 > 算法实例_线性表 By:比方
算法实例_线性表 By:比方
算法实例_线性表
By:比方
- 什么是线性表?
从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列。
- 线性表的结构和特点
1. 仅有一个开始节点x1,没有直接前趋节点,有妾只有一个直接后续节点x2;
2. 仅有一个终结节点xn,仅有一个前趋节点xn-1;
3. 对于同一个线性表,其中没一个数据的元素,都必须具备相同的数据结构类型,
且没一个元素的长度相同。
顺序表
线性表的基本流程
- 初始化
- 计算表长
- 获取节点
- 查找节点
- 插入节点
- 删除节点
- 显示节点
1 顺序表的结构定义 2 #define MaxTableLen 100 //顺序表最大长度 3 4 typedef struct //要存储的数据结构 5 { 6 char Key[10]; 7 char Name[12]; 8 int Age; 9 }DATA;10 11 typedef struct //顺序表的结构12 {13 DATA LisiData[MaxTableLen+1]; //保存顺序表结构的数组14 int ListLen; //顺序表中已存节点的数量 15 }LISTTPYE;
1. 线性表的初始化如下
1 void ListInit(LISTTPYE *ListPY ) //初始化为一个空的表2 {3 ListPY->ListLen = 0;4 }
计算顺序表中一共存放了多少数据
1 int ListLengh(LISTTPYE *ListPY) //计算顺序表中的数量2 {3 return ListPY->ListLen;4 }
插入一个数据到顺序表中
1 int ListInst(LISTTPYE *ListPY,int n,DATA Data) 2 { 3 int i; 4 5 if (ListPY->ListLen >= MaxTableLen) //判断顺序表是否已经存满 6 { 7 printf("顺序表已经存满!\r\n"); 8 return 0; 9 }10 11 if ((n < 1) || (n > ListPY->ListLen-1))//插入节点的序号不正确12 {13 printf("插入数据错误\r\n");14 return 0;15 }16 17 for (i = ListPY->ListLen; i >= n;i--) //将顺序表的节点往后移动18 {19 ListPY->LisiData[i+1] = ListPY->LisiData[i];20 }21 22 ListPY->LisiData[n]= Data;23 24 ListPY->ListLen++;25 26 return 1;27 28 }
增加一个数据
1 int ListAdd(LISTTPYE *ListPY,DATA Data) //增加顺序表中的数据 2 { 3 if (ListPY->ListLen >= MaxTableLen) 4 { 5 printf("顺序表已经满了\r\n"); 6 return 0; 7 } 8 9 ListPY->LisiData[++ListPY->ListLen] = Data;10 11 return 1;12 }
删除
1 int ListDelect(LISTTPYE *ListPY,int n) // 删除顺序表中的元素 2 { 3 int i; 4 if ((n < 1) || ( n > ListPY->ListLen+1)) //检查节点序号是否正确 5 { 6 printf("删除节点错误\r\n"); 7 return 0; 8 } 9 10 for (i = n ; i < ListPY->ListLen ; i++) //顺序表数据向前移动11 {12 ListPY->LisiData[i] = ListPY->LisiData[i+1];13 }14 15 ListPY->ListLen--; //顺序表元素-116 17 return 1;18 }
查找顺序表的数据
1 DATA *ListFindNum(LISTTPYE *ListPY,int n) //按照序号查找内容,返回数据 2 { 3 if ( (n < 1) || (ListPY->ListLen +1)) 4 { 5 printf("节点序号错误,无法返回节点\r\n"); 6 return NULL; 7 } 8 9 return &(ListPY->LisiData[n]);10 11 }
同上
1 int ListFindStr(LISTTPYE *ListPY,char *Key) //按照关键字查找信息 2 { 3 int i; 4 for ( i = 1; i <ListPY->ListLen; i++) 5 { 6 if (strcmp(ListPY->LisiData[i].Key,Key) == 0) 7 { 8 return i; 9 }10 }11 return 0;12 }
显示顺序表中所有的内容
1 int ListAll(LISTTPYE *ListPY) 2 { 3 int i; 4 for (i = 1; i <ListPY->ListLen;i++) 5 { 6 printf("%s\t%s\t%d \r\n",ListPY->LisiData[i].Key,ListPY->LisiData[i].Name,ListPY->LisiData[i].Age); 7 } 8 9 return 0;10 }
实例调用样例
1 int main(int argc, char* argv[]) 2 { 3 int i; 4 LISTTPYE ListPY; 5 DATA Data; 6 DATA* pData; 7 char Key[12]; 8 9 ListInit(&ListPY);//初始化顺序表10 11 do 12 {13 printf("输入(学号,姓名,年龄)\r\n");14 fflush(stdin);15 scanf("%s %s %d",&Data.Key,&Data.Name,&Data.Age);16 if (Data.Age)17 {18 if (!ListAdd(&ListPY,Data)) //插入节点19 {20 break;21 }22 }23 else24 {25 break;26 }27 28 } while (1);29 30 31 printf("顺序表的节点顺序为:\r\n");32 ListAll(&ListPY);33 fflush(stdin); //清空缓冲区34 35 36 printf("要查找节点的关键字\r\n");37 scanf("%s",Key);38 i = ListFindStr(&ListPY,Key);39 pData = http://www.mamicode.com/ListFindNum(&ListPY,i);40 if (pData)41 {42 printf("第%d节点为:(%s,%s,%d)\r\n",pData->Key,pData->Name,pData->Age);43 }44 45 return 0;46 }
附件地址:http://pan.baidu.com/s/1pJ2Vlov
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。