1、数据结构第二章第二章一、求AUB(即A与B的并集)。Void union (Linear_list LA,linear _list LB) /假定linear_List是线型表类型 N=ListLength(LA); /求表的表长 For (i=1;i=ListLength(LB);i+)( X=GetNode(LB,i); /取LB中第i个元素赋给x If(LocateNode(LA,x)=0) /若没有找到 InsertList(LA,+n,x); 二、删除线性表L中重复的元素。 Void purge (Linear_List L) i=1; While(i=Listlength(L) X
2、=GetNode(L,i);j=i+1; While(j=ListLength(l) Y=GetNode(L,j); If(x=y) /表示x与y内容相同 DeleteList(L,j); Else J+; i+; 三、定义顺序表 #define ListSize 100 /定义表空间为100 Typedef int DataType; /datatype类型为int Typedef struct Datatype data(listSize); /数组data用来存放表结点 Int length; /线性表的表长 seqlist;四、顺序表插入算法 Void Insertlist(SeqLi
3、st *L,int I,DataType x) /在顺序表L中第i个位置之前插入一个新元素a Int j; If(ii-length+1)( Printf(“position error”); Return; If(L-length=ListSize)( Printf(“overfloew”); Return; For(j=L-length-1;j=i-1;j-) L-data(j+1)=l-dataj /从最后一个元系开始后移 L-datai-1=x; /插入新元素x,i-1个元素实际为第i个元素 L-Length+; /表长度加1五、顺序表L中删除第i个元素 DataType Delete
4、list(Seqlist *L,int i) /顺序表L中删除第i个元素,并返回被删除元素 Int j; DataType x; /DataType是一个通用标识符,在使用时再定义实际类型 If(iL-length) Printf(“position error”); Exit(0); X=L-datai; /保存被删除元素 For(j=1;jLength-1;j+) L-dataj-1=L-dataj; /元素前移 L-length-; /实际表长减1 Return x; /返回被删除的元素六、将顺序线性表,将该线性表逆置SeqList ConvertsSeqList L DataType
5、x; K=l.length/2; For(i=0;ik;i+) X=L.datai; L.datai=L.dataL.length-i-1; L.dataL.length-i-1=x; Return L;七、找到最大值及最小值及位置Void MaxMin(SeqList L,DataType *max,DataType *min,int *k,int *j) int i; *max=L.data0; *min=L.data0;*k=*j=1; /先假设第一个元素就是最大值,也是最小值 For (i=1;i*.max) *max=L.datai; *k=i; While if (L.dataid
6、ata=ch; /数据域赋值 p-next=head; /指针域赋值 head=p; /头指针指向新节点 ch=getchar(); /读入下一个字符 Return head; /返回链表头指针八、尾插法 LinkList CreatelistR() LinkList head,rear; ListNode *p;Char ch;Head=NULL; rear=NULL; /置空单链表Ch=getchar(); /读入第一个字符While(ch!=n) P=(ListNode *)malloc(sizeof(ListNode); /申请新结点 p-data=ch; /读入数据赋值 if(hea
7、d=NULL)head=p; /新结点*P插入空表 else rear-next=p; /新结点*p插入到非空结点 rear=p; /尾指针指向新表尾 ch=getchar(); if(rear!=NULL)rear-next=NULL; /终端结点域置空return head;另引入头结点后,尾插法可简化为:p-data=ch;r=next=p; /新结点连接到尾结点之后r=p; /尾指针指向新结点九、带头结点单链表的查找算法 ListNode * GetNode(LinkList head,int i)/head为带头结点的单链表头指针,i为要查找的序号 /若查找成功,则返回查找结点存储地
8、址,否则返回NULLListNode *p; int j;p-head-next;j=1; /使p指向第一个结点,j置1while(p!=NULL &jnext;+j; If(j=i) Return P;Else Return NULL;按值查找:ListNode *locatenodek(Linklist head,DataType k)/head为带头结点单链表的头指针,k要查找的结点的值ListNode *p=head-next; While(p&p-data!=k) P=p-next;Return p;在P结点之后插入新结点*SVoid insertList(LinkList head
9、,int I,DataType x) /在以head为头指针的带头结点的单链表中第i个结点位置插入一个x新结点ListNode *p,*s; int j;P=head;j=0;While(p!=NULL&jnext;+j; If(p=NULL) Printf”(errorn”);return;Else S=(ListNode *)malloc(sizef(ListNode); S-data=x;s-next=p-next; P-next=s;删除操作: s=p-next; p-next=s-next; x=s-data; free(s); return x; 十、单链表A分解马A和B,其中头结
10、点分别为a和b,使得A中为奇数元素,B中为偶数元素。Void sPlit(LinkList a,linkList b)/按序号奇偶分解单链表,注意b在调用前是一个带头结点的空链表ListNode *p,*r,*r; P=a-next; /p指向表头结点 R=a; /r指向表A的当前结点 S=b; /s指向表B的当前结点 While (p!=NULL) r-next=p; /把序号为奇数的结点链接到A表上 r=p; /r总是指向A表的最后一个结点 p=next; if(p) s-next=p; /序号为偶数的结点链接到B表上 s=p; / s总是指向B表的最后一个结点 p=next; /P指向原
11、链表A中的偶数序号的结点 r-next=s-next=NULL;十二、将La和Lb单链表(带头结点),两个单链表都是按数值递增有序的,将这两个表合并成为一个有序表 Lc。LinkList MergeList(LinkList la,Linklist Lb) /归并两个有序表la和lb为有序表lc ListNode *pa,*pb,*pc; LinkList Lc;Pa=La-next; pb=Lb-next; /pa,pb分别指向两个链表开始结点Lc=pc=La; /用La的头结点做为Lc的头结点While(pa!=NULL&pb!=NULL) If(pa-datadata) Pc-next=
12、pa;pc=pa;pa=pa-next; /将pa指向结点指向pc Else Pc-next=pb;pc=pb; pb=pb-next; /将pb指向结点指向pc Pc-next=pa!=NULL?pa:pb; /插入剩余部分,哪个不空,就插哪个Free(Lb); /释放lb头结点Return Lc; /返回合并后的表十三、从大到小顺序排列的头结点指针为L的非空单循环链表,插入一个结点并保持有序。Void insertlist (LinkList L,int x) /将值为x的新结点插入到有序循环表中适当位置 listNode *s,*p,*q; s=(ListNOde*)malloc(siz
13、eof(ListNode); /申请结点存储空间 s-data=x; p=L; q=p-next; /q指向开始结点 while(q-datax&q!=L) p=-next; /p指向q的前趋 q=p-next; /q指向当前节点 p-next=s; /插入*s结点 s-next=q;十四、在双负链表*P之前插入一结点 Void DLInsert(Dlnode *p,DataType x) /将值为x的新结噗插入到带头结点的双向链表的*P之前 DLNode *s=(DLNOde *)malloc(sizeof(DLNode); s-data=x;s-prior=prior;s-next=p;p
14、-prior-next=s; p-prior=s;双向链表删除结点: DataType DLDelete (DlNode *P) p-prior-next=p-next; p-next-prior=p-prior; x=p-data; free(p);return x;十五、将一个头结点指针为head的循环链表,写一算法,将其修改为真正的双向循环链表Void trans(Dlinklist head) Dlnode *p ; P=head; /使p指向头结点 While(p-next!=head) p-next-prior=p; /p指结点的直接后继的前趋就是p p=p-next; /p指向下一个结点 Head-prior=p; /head的前趋指向表的终端结点两个顺序表A和B,都递增有序,从A中删除与B相同的元素。带头结点的单链表,将P指向结点与后继结点位置交换。已知两个集合A,B,递增有序,设计A与B的交集。设带头结点的双向循环链表,head为头指针,在x之 前插入一个值为y的结点
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1