C
来源:互联网 发布:连江尚德中学网络硬盘 编辑:程序博客网 时间:2024/05/21 03:54
数据结构顺序链表的实现
#include <stdio.h> #include <stdlib.h> //成功返回1 ,失败返回0,存储分配失败返回-1 typedef int Status; #define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量 #define LISTINCREMENT 10 //线性表存储空间的分配增量 typedef int ElemType;//元素类型 typedef struct SqList{ ElemType *elem;//线性表首地址 int length;//当前的长度 int listsize;//当前分配的存储容量,以elemType为单位 }SqList; //创建一个线性表int InitList_Sq(SqList &L){(*L).elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));if(!(*L).elem){ return -1; /* 存储分配失败 */ } (*L).length=0; /* 空表长度为0 */ (*L).listsize=LIST_INIT_SIZE; /* 初始存储容量 */ return 1;} //依次显示顺序表中的元素 void PrintList(SqList *L) {int i; for(i=1;i<=(*L).length;i++){ printf("%d\t", (*L).elem[i-1]);} printf("共%d个元素\n",(*L).length);}//在表中第pos个位置之前插入新元素e,注意pos指队伍编号是从1开始的 int Insert_Sq(SqList *L,ElemType e,int pos) { ElemType *n,*q,*p;if(pos<1||pos>(*L).length+1){//pos值不合法 return 0;} if((*L).length>=(*L).listsize){ //存储空间满时,增加分配 n = (ElemType *)realloc(L,((*L).listsize+LISTINCREMENT*sizeof(ElemType))); if(!n) return -1; // 存储分配失败 (*L).elem=n; (*L).listsize += LISTINCREMENT*sizeof(ElemType); } q=(*L).elem+pos-1; // q为插入位置 for(p=(*L).elem+(*L).length-1;p>=q;p--) // 插入位置及之后的元素右移 *(p+1)=*p; *q=e; //插入e */ (*L).length++;// 表长增1 */}//删除第pos个元素,注意pos指队伍编号是从1开始的 int DeleteElem(SqList *L,int pos) {ElemType *p,*q;if(pos<1||pos>(*L).length+1){//pos值不合法 return 0;}p = (*L).elem + pos -1;//被删元素的位置 q=(*L).elem+(*L).length-1; //表尾元素的位置 for(p=p+1;p<=q;p++){*(p-1)=*p;} (*L).length -- ;return 1;}//(选作)将两个顺序表合并存入第一个顺序表,使所有元素从小到大排列void MergeList(SqList *La,SqList *Lb){ int i,j,temp;int lenB = (*Lb).length ;for(i=0;i<lenB;i++){Insert_Sq(La , (*Lb).elem[i] ,(*La).length);}int lenA = (*La).length ;for(i=0;i<lenA;i++){for(j=0;j<lenA-i-1;j++){if((*La).elem[j]>(*La).elem[j+1]){temp = (*La).elem[j];(*La).elem[j] = (*La).elem[j+1];(*La).elem[j+1] = temp;}}}}int main(){ SqList list1, list2; int i,pos; ElemType temp; printf("Shibingfan ,Hello\n");//建立一个新的顺序表list1 InitList_Sq(&list1);printf("list1:\t");PrintList(&list1);//在list1中依次插入1-3-5-7-9for(i=1;i<=5;i++){temp=2*i-1; Insert_Sq(&list1,temp,i); }printf("new list1:\t");PrintList(&list1);//删除指定的位置上的元素 printf("Pls enter the position (starting from 1) to delete:\t"); scanf("%d",&pos); DeleteElem(&list1,pos); printf("list1 after delete:\t"); PrintList(&list1);//建立一个新的顺序表list2,依次插入2-4-6-8 InitList_Sq(&list2);for(i=1;i<=4;i++){temp=2*i; Insert_Sq(&list2,temp,i); }printf("list2:\t");PrintList(&list2);//将上述两个顺序表合并 MergeList(&list1,&list2); printf("Merged list:\t"); PrintList(&list1); return 0; }