c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表
2012-08-13 13:27
1246 查看
//c语言版数据结构(奇迹冬瓜)-链表实战(2)合并两有序线性表 //题目:已知线性表La和Lb中的数据元素按值非递减有序排列,现要求将La与Lb一起为一个新的线性表Lc(值非递减排列) /* 主要函数思想: 初始化La,Lb,Lc链表头; 输入La,Lb链表数据; 当La链表下一个结点不为空或者Lb链表下一个结点不为空 { 比较La和Lb的结点 { La的结点>=Lb的结点 { Lc的结点指向下一个结点为Lb的当前结点; Lb的结点移到下一个结点; } 其余 { Lc的结点指向下一个结点为La的当前结点; La的结点移到下一个结点; } } Lc移动一个结点; } La的下一个结点不为空 { Lc指向La的剩余部分; } 其他 { Lc指向Lb的剩余部分; } */ //--------头文件--------- #include<stdio.h> #include<stdlib.h> //--------宏定义--------- #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define TRUE 1 #define ERROR 0 #define OVERFLOW -2 //-----结构体和替换----- typedef int Data; typedef struct { Data *data; int length; int listsize; }List,*NList; //-------函数------- int InitList(NList L); int InputData(NList L,int n); Data GetData(NList L,int n); int Compare(Data a,Data b); int InsertC(NList L,Data d,int k); void OutPutC(NList L); //------主函数------ void main() { List La,Lb,Lc,*A=&La,*B=&Lb,*C=&Lc; int n,i,j,k=0; Data da,db; InitList(A);InitList(B);InitList(C); printf("请输入集合A的元素个数:"); scanf("%d",&n); InputData(A,n); printf("请输入集合B的元素个数:"); scanf("%d",&n); InputData(B,n); i=A->length;j=B->length; //printf("A=%d B=%d\n",i,j); while(i&&j) { da=GetData(A,A->length-i);db=GetData(B,B->length-j); if(Compare(da,db)) { InsertC(C,da,k++); i--; } else { InsertC(C,db,k++); j--; } printf("A=%d B=%d\n",i,j); } while(i) { da=GetData(A,A->length-i); InsertC(C,da,k++); i--; } while(j) { db=GetData(B,B->length-j); InsertC(C,db,k++); j--; } OutPutC(C); } //-----------其余函数----------- int InitList(NList L) { if(!(L->data=(Data*)malloc(LIST_INIT_SIZE*sizeof(Data)))) { exit(OVERFLOW); } L->length=0; L->listsize=LIST_INIT_SIZE; return TRUE; } int InputData(NList L,int n) { Data *newbase; printf("输入集合中的元素(递增输入):"); for(;n>0;n--) { if(L->length>=L->listsize) { if(!(newbase=(Data*)realloc(L->data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Data)))) { L->data=newbase; L->listsize+=LISTINCREMENT; } } scanf("%d",&L->data[L->length++]); //printf("%d\n",L->length); } return TRUE; } Data GetData(NList L,int n) { if(n<0||n>L->length-1) { exit(OVERFLOW); } return L->data ; } int Compare(Data a,Data b) { if(a<=b) { return 1; } return 0; } int InsertC(NList L,Data d,int k) { Data *newbase; if(L->length>=L->listsize) { if(!(newbase=(Data*)realloc(L->data,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(Data)))) { L->data=newbase; L->listsize+=LISTINCREMENT; } } L->data[k]=d; L->length++; return TRUE; } void OutPutC(NList L) { int i=0; printf("C:"); for(;i<L->length;i++) { printf("%d ",L->data[i]); } printf("\n"); getchar(); getchar(); }
相关文章推荐
- c语言版数据结构(奇迹冬瓜)-链表实战(4)双链表解一元多项式相乘
- c语言版数据结构(奇迹冬瓜)-栈实战(4)表达式求值
- c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加
- c语言版数据结构(奇迹冬瓜)-栈实战(1)栈解迷宫<迷宫算法>
- c语言版数据结构(奇迹冬瓜)-栈实战(3)括号匹配的检测
- c语言版数据结构(奇迹冬瓜)-栈实战(2)整数进制转换<10进制到2,8,16进制>
- 数据结构 链表 合并两个有序的单链表 C语言版
- c语言版数据结构(奇迹冬瓜)-队列实战(1)离散事件模拟(银行排队)
- 【C语言版数据结构】线性表的链式表示,并且实现合并两个非递减有序排列到新的线性表
- 数据结构-用链表函数实现链表的有序合并
- 【数据结构_链表_最小堆】 链表找环,链表找交点,合并有序链表
- 数据结构之将两个递增的有序链表合并为一个递增的有序链表
- 【数据结构练习】2.两个有序链表序列的合并
- PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)
- 数据结构----实现对2个链表La,Lb有序合并,对相同的元素进行删除,
- 数据结构 02-线性结构1 两个有序链表序列的合并
- c语言版数据结构(奇迹冬瓜)-串(定长顺序存储各项操作)
- c语言版数据结构(奇迹冬瓜)-数组和广义表(十字链表稀疏矩阵的加法)
- 数据结构-剑指offer-合并有序链表
- PTA数据结构之两个有序链表序列的合并