首页 > 代码库 > 算法实例_线性表 By:比方

算法实例_线性表 By:比方

算法实例_线性表

                                                                                                                                                                                    By:比方

  1. 什么是线性表?

        从线性表的功能逻辑上来看,线性表就是由n(n>=0)个数据元素的排序组合,数据由x1,x2,x3,...,xn结构有序的顺序排列。

 

  1. 线性表的结构和特点

                       1.              仅有一个开始节点x1,没有直接前趋节点,有妾只有一个直接后续节点x2;

                       2.              仅有一个终结节点xn,仅有一个前趋节点xn-1;

                       3.              对于同一个线性表,其中没一个数据的元素,都必须具备相同的数据结构类型,

              且没一个元素的长度相同。

顺序表

  

 

线性表的基本流程

  1. 初始化
  2. 计算表长
  3. 获取节点
  4. 查找节点
  5. 插入节点
  6. 删除节点
  7. 显示节点
 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