数据结构链表的题

2025-03-04 05:27:11
推荐回答(1个)
回答1:

//这里addNode实现了链表合并,不过这里合并其实是把第二个链表加入第一个链表后面,如果想实现合并后放在一个新的链表,可以稍微更改该函数,使其返回合并后的新链表
#include
#include

typedef struct node
{
int data;
node* pNext;
}Node;

//链表的操作,以有头节点为例,无头节点类似

//初始化链表,头结点data=0,pNext=NULL;
Node* initNodeList()
{
Node *head = (Node*) malloc(sizeof(Node));
if(NULL == head)
{
return NULL;
}
else
{
//head->data = 0;
head->pNext = NULL;
return head;
}
}

//输入数据建立链表
void createNodeList(Node* head)
{
int x;
Node *h=head;
printf("尾插法建立链表,请输入链表数据,输入0表示结束:\n");
scanf("%d",&x);
while(x!=0)
{
Node *p=(Node*) malloc(sizeof(Node));
p->data=x;
p->pNext=NULL;
h->pNext=p;
h=h->pNext;
scanf("%d",&x)!=0;
}
}

//尾插法增加节点,增加的节点数据域可以为任何,但pNext应该有指向或为空
bool addNode(Node* head,Node* node)
{
if(NULL == head)
{
return false;
}
Node* p = head->pNext;
Node* q = head;
while(NULL != p)
{
q = p;
p = p->pNext;
}
q->pNext = node;
return true;
}


//排序(升序)
void sort(Node* head)
{
//冒泡排序
Node* pHead = head;
if(head == NULL)
{
return;
}
if(pHead->pNext == NULL)
{
return;
}
Node* pi = pHead->pNext;
Node* pj = pi->pNext;
for(;pi != NULL;pi=pi->pNext)
{
for(pj = pi->pNext;pj != NULL;pj=pj->pNext)
{
if(pj->datadata)
{
int tmp = pj->data;
pj->data = pi->data;
pi->data = tmp;
}
}
}
}


//打印单链表  
void print(Node *head)  
{  
Node *p=head->pNext;
 while(p!=NULL)
 {
 printf("%d ",p->data);
 p=p->pNext;
 if(p==NULL)
 printf("\n");
 }
}   
void main()
{
Node* ha=initNodeList();
Node* hb=initNodeList();
printf("第一条单链表:\n");
createNodeList(ha);
sort(ha);
print(ha);
printf("第二条单链表:\n");
createNodeList(hb);
sort(hb);
print(hb);
addNode(ha,hb->pNext);
sort(ha);
printf("合并后:");
print(ha);
system("pause");
}