#include <stdio.h>
#include <stdlib.h>
#define name_to_str(name_) (#name_)
/**< 定义结点及结构体指针,结构体指针linklist为链表头结点指针*/
typedef struct LNode{
int data;
struct LNode* next;
}LNode,*LinkList;//结构体指针
/**< 初始化链表 */
LNode* Init_LL()
{
LinkList p=(LNode*)malloc(sizeof(LNode));
p->data=NULL;
p->next=NULL;
return p;
}
/**< 在第pos个结点之前插入一个DATA为Val的新节点 */
void Insert_LL(LinkList pLL,int pos,int Val)
{
LNode* P=pLL;
LNode* A=Init_LL();//不初始化结点不能使用,malloc相关。
A->data=Val;
int i;
for(i=0;i<pos-1;i++)
{if(P)
P=P->next;
else
{
printf("位置非法");
exit(-1);}
}
A->next=P->next;
P->next=A;
}
/**< 删除结点,pos之前 */
void Delete_LL(LinkList pLL,int pos)
{
int i;
LinkList q,p=pLL;
for(i=0;i<pos-1;i++)
p=p->next;
q=p->next;
p->next=q->next;
free(q);
}
/**< 求直接前驱 */
LNode* PriorElment_LL(LinkList pLL,int Data)
{
LinkList p=pLL;
while(p->next->data!=Data)
p=p->next;
printf("%d_prior_element_data_is_%d",Data,p->data);
return p;
}
/**< 求直接后继 */
LNode* NextElment_LL(LinkList pLL,int Data)
{
LinkList p=pLL;
while(p->data!=Data)
p=p->next;
printf("%d_next_element_data_is_%d",Data,p->data);
return p;
}
/**< 返回第POS个数据的值*/
int GetElement_LL(LinkList pLL,int pos)
{
LinkList p=pLL;
int i;
for(i=0;i<pos;i++)
p=p->next;
printf("the %dth element is %d",pos,p->data);
return p->data;
}
/**< 泡排 */
void BubbleSort_LL(LinkList pLL)
{
LinkList p=pLL,q;
int cnt=0,i,j,temp;
while(p->next!=NULL)
{
cnt++;
p=p->next;
}
//printf("cnt=%d",cnt);
q=pLL->next;
for(i=0;i<cnt-1;i++)
{
p=q;
for(j=0;j<cnt-i-1;j++)
{
if(p->data<p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
//printf("比较%d?=%dexchange\n",p->data,p->next->data);///非常奇怪,总是大数小数exchange
p=p->next;
}
else
{
//printf("比较%d?=%dunchange\n",p->data,p->next->data);
p=p->next;}
}
//printf("当前循环完成\n");
}
Printf_LL(pLL);
}
/**< 合并有序链表 */
LinkList Add_LL(LinkList p,LinkList q)
{
LinkList a=p->next,b=q->next;
LinkList c=Init_LL();
LinkList L=c;
while(a&&b)
{
if (a->data>=b->data)
{
// printf("1 %d,%d\n",a->data,b->data);
c->next=a;
a=a->next;
}
else
{
// printf("2 %d,%d\n",a->data,b->data);
c->next=b;
b=b->next;
}
// printf("CDATA=%d\n",c->data);
c=c->next;
c->next=NULL;
}
if (a==NULL)
c->next=b;
else c->next=a;
printf("合并有序链表结果为:\n");
Printf_LL(L);
}
/**< 打印链表 */
void Printf_LL(LinkList pLL)
{
LNode* p=pLL;
int i=1;
printf("打印链表结果为:");
do{
p=p->next;
printf("linklist[%d]=%d\t",i,p->data);
i++;
}while(p->next!=NULL);
printf("\n\n");
}
/**< 测试ADT */
int main()
{
LinkList p=Init_LL();
Insert_LL(p,1,6);
Insert_LL(p,2,8);
Insert_LL(p,3,4);
Insert_LL(p,3,3);
Insert_LL(p,2,1);
Insert_LL(p,4,9);
Printf_LL(p);
LinkList q=Init_LL();
Insert_LL(q,1,2);
Insert_LL(q,2,5);
Insert_LL(q,3,7);
Insert_LL(q,3,3);
Insert_LL(q,2,11);
Insert_LL(q,3,20);
Insert_LL(q,1,12);
Printf_LL(q);
BubbleSort_LL(p);
BubbleSort_LL(q);
Add_LL(p,q);
return 0;
}
链表ADT实现(C语言)2018.3.11
最新推荐文章于 2023-01-17 19:49:33 发布