初学数据结构,写的链表程序,目前还有点问题(头结点的0),望大牛指点
#include<stdio.h>
#include<stdlib.h>
typedef struct Node Linklist;
typedef struct Node * PLinklist;
struct Node{
int num;
PLinklist Next;
};
void In_Linklist(PLinklist P,int num,int n);
PLinklist New_Linklist(void);
void display(PLinklist P);
/*在num结点后插入一个新结点n*/
void In_Linklist(PLinklist P,int num,int n)
{
PLinklist Node;
PLinklist New;
PLinklist Old;
Node=P;
while(Node->num!=num)
Node=Node->Next;
Old=Node->Next;
New=malloc(sizeof(Linklist));
if(New==NULL)
printf("The memory is full!\n");
New->num=n;
New->Next=Old;
Node->Next=New;
}
/*创建一个新链表*/
PLinklist New_Linklist(void)
{
PLinklist New;
New=malloc(sizeof(Linklist));
if(New==NULL)
printf("The memory is full!\n");
New->num=0;
New->Next=NULL;
return New;
}
/*从头打印链表结点*/
void display(PLinklist P)
{
PLinklist New;
New=P;
while(New->Next!=NULL)
{
printf("%d\n",New->num);
New=New->Next;
}
printf("%d\n",New->num);
}
/*在链表P末尾插入心结点n*/
void Insert_Linklist(PLinklist P,int n)
{
PLinklist New;
PLinklist Old;
Old=P;
while(Old->Next!=NULL)
Old=Old->Next;
New=malloc(sizeof(Linklist));
if(New==NULL)
printf("The memory iS full!\n");
New->num=n;
New->Next=NULL;
Old->Next=New;
}
/*删除P链表中n结点*/
void Del_Linklist(PLinklist P,int n)
{
PLinklist Node;
PLinklist Old;
PLinklist New;
Node=P;
while(Node->Next->num!=n)
Node=Node->Next;
Old=Node;
New=Old->Next;
Old->Next=New->Next;
free(New);
}
/*在链表P中搜索n*/
int Find(PLinklist P,int n)
{
PLinklist Node;
int flag=0;
Node=P;
while(Node!=NULL )
{
if(Node->num==n)
{
flag=1;
break;
}
// printf("The 'n' is not in P linklist!\n ");
Node=Node->Next;
}
}
/*求两个链表的并*/
PLinklist Union(PLinklist P1,PLinklist P2)
{
PLinklist P;
PLinklist node;
P=New_Linklist();
node = P1;
while(node!=NULL)
{
Insert_Linklist(P,node->num);
node=node->Next;
}
node=P2;
while(node!=NULL)
{
if(!Find(P1,node->num))
Insert_Linklist(P,node->num);
node=node->Next;
}
return P;
}
/*求两个链表的交*/
PLinklist Intersect(PLinklist P1,PLinklist P2)
{
PLinklist P,Node;
P=New_Linklist();
Node=P1;
while(Node!=NULL)
{
if(Find(P2,Node->num))
Insert_Linklist(P,Node->num);
Node=Node->Next;
}
return P;
}
/*求两个链表的余i(P1相对于P2的余)*/
PLinklist Complement(PLinklist P1,PLinklist P2)
{
PLinklist P;
PLinklist Node;
P=New_Linklist();
Node=P1;
while(Node->Next!=NULL)
{
if(!Find(P2,Node->num))
Insert_Linklist(P,Node->num);
Node=Node->Next;
}
return P;
}
/*生成一个链表并打印出来*/
int main(void)
{
int i;
PLinklist Head1,Head2;
Head1=New_Linklist();
Head2=New_Linklist();
for(i=1;i<10;i++)
{
// In_Linklist(Head,i,i+1);
Insert_Linklist(Head1,i);
// Insert_Linklist(Head2,i);
}
for(i=8;i<18;i++)
{
Insert_Linklist(Head2,i);
}
// Del_Linklist(Head,5);
// display(Union(Head1,Head2));
// display(Intersect(Head1,Head2));
display(Complement(Head1,Head2));
return 0;
}