简答的链表实现,增加了求两个链表的并集的功能
Code:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct Node
{
int data;
struct Node *pNext;
}Node,*PNode;
PNode create_list(void);
void traverse_list(PNode pHead);
PNode insert_list(PNode pHead,int pos,int val);
PNode delete_list(PNode pHead,int pos);
void hebin_list(PNode pHead1,PNode pHead2);
int main()
{
PNode pHead1=NULL,pHead2=NULL;
printf("生成第一条链表:\n");
pHead1=create_list();
insert_list(pHead1,3,4);
insert_list(pHead1,3,7);
delete_list(pHead1,7);
traverse_list(pHead1);
printf("生成第二条链表:\n");
pHead2=create_list();
traverse_list(pHead2);
printf("将两条链表合并:\n");
hebin_list(pHead1,pHead2);
traverse_list(pHead2);
return 0;
}
void hebin_list(PNode pHead1,PNode pHead2){
PNode p=pHead1->pNext;
PNode q=pHead2->pNext;
PNode s;
while(p->pNext!=NULL){
while(q->pNext!=NULL){
if(p->pNext->data==q->pNext->data){
break;
}else{
q=q->pNext;
}
}
if(q->pNext==NULL)
{
s=(PNode)malloc(sizeof(Node));
s->data=p->pNext->data;
s->pNext=NULL;
q->pNext=s; //p->next=p->next->next;
}
p=p->pNext;
q=pHead2->pNext;
}
}
PNode create_list(void)
{
int len;
int i;
int val;
PNode pHead=(PNode)malloc(sizeof(Node));
if(NULL==pHead)
{
printf("内存分配失败.\n");
exit(-1);
}
PNode p=pHead;
p->pNext=NULL;
printf("请输入您需要生成的结点数:len=");
scanf("%d",&len);
for(i=0;i<len;i++)
{
printf("请输入您要保存第%d的结点值",i+1);
scanf("%d",&val);
PNode pNew=(PNode)malloc(sizeof(Node));
if(NULL==pNew)
{
printf("分配失败,终止!\n");
exit(-1);
}
pNew->data=val;
p->pNext=pNew;
pNew->pNext=NULL;
p=pNew;
}
return pHead;
}
void traverse_list(PNode pHead)
{
PNode p=pHead->pNext;
while(NULL!=p)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
return;
}
PNode insert_list(PNode pHead,int pos,int val)
{
int i=0;
PNode p=pHead;
while(p!=NULL&&i<pos-1)
{
p=p->pNext;
i++;
}
if(i>pos-1||p==NULL)
exit (-1);
PNode pNew=(PNode)malloc(sizeof(Node));
if(NULL==pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data=val;
PNode q=p->pNext;
p->pNext=pNew;
pNew->pNext=q;
}
PNode delete_list(PNode pHead,int pos)
{
int i=0;
PNode p=pHead;
while(p->pNext!=NULL&&i<pos-1)
{
p=p->pNext;
i++;
}
if(p->pNext==NULL||i>pos-1)
exit (-1);
PNode q=p->pNext;
p->pNext=p->pNext->pNext;
free(q);
q=NULL;
return ;
}