#define NULL 0
#define TYPE struct node
#define LEN sizeof(struct node)
struct node
{
int num;
struct node *next;
};
TYPE * creat(int n)
{
struct node *head,*pf,*pb;
int i;
for(i=0;i<n;i++)
{
pb=(TYPE *)malloc(LEN);
printf("please input the node\n");
scanf("%d",&pb->num);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}
TYPE * delete(TYPE * head,int num)
{
TYPE *pf,*pb;
if(head==NULL)
{ printf("\nempty list!\n");
goto end;}
pb=head;
while (pb->num!=num && pb->next!=NULL)
{pf=pb;pb=pb->next;}
if(pb->num==num)
{ if(pb==head) head=pb->next;
else pf->next=pb->next;
printf("The node is deleted\n"); }
else
free(pb);
printf("The node not been found!\n");
end:
return head;
}
TYPE * insert(TYPE * head,TYPE * pi)
{
TYPE *pb ,*pf;
pb=head;
if(head==NULL)
{ head=pi;
pi->next=NULL; }
else
{
while((pi->num>pb->num)&&(pb->next!=NULL))
{ pf=pb;
pb=pb->next; }
if(pi->num<=pb->num)
{ if(head==pb) head=pi;
else pf->next=pi;
pi->next=pb; }
else
{ pb->next=pi;
pi->next=NULL; }
}
return head;
}
void print(TYPE * head)
{
printf("the list is:\n");
while(head!=NULL)
{
printf("%d\n",head->num);
head=head->next;
}
}
main()
{
TYPE * head,*pnum;
int n,num;
printf("input the number of node: ");
scanf("%d",&n);
head=creat(n);
print(head);
printf("Input the deleted number: ");
scanf("%d",&num);
head=delete(head,num);
print(head);
printf("Input the inserted number: ");
pnum=(TYPE *)malloc(LEN);
scanf("%d",&pnum->num);
head=insert(head,pnum);
print(head);
getch();
}
或者帮我用winTC编出一个新程序,实现N结点单链表的建立、查找、删除和插入功能。万分感谢!!
我是在 VC++6.0 上写的.........关于链表的查找,删除,插入,销毁..........
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct node_tag
{
ElemType data;
struct node_tag *next;
}*Linklist,Lnode;
void initLinklist(Linklist *head) //初始化链表
{
*head=(Lnode *)malloc(sizeof(Lnode));
if(*head==NULL)
{
printf("初始化失败.\n");
exit(0);
}
(*head)->next=NULL;
}
void insertLinklist(Linklist head,int n) //向链表中插入元素
{
Linklist p,q=head;
while(q->next)
q=q->next; //q指向链表的最后一个结点
p=(Lnode*)malloc(sizeof(Lnode));
if(p==NULL)
{
printf("插入元素时分配空间失败>\n");
exit(0);
}
p->data=n;
q->next=p;
p->next=NULL;
}
int deleteLinklist(Linklist head,int i) //删除链表中第i个元素
{
Linklist p=head,q;
int j=0,e; //e返回删除元素的值
while(p->next && j<i-1)
{
p=p->next;
j++;
}
if(!(p->next) || j>i-1)
return -1;
q=p->next;
p->next=q->next;
e=q->data;
free(q);
return e;
}
int searchLinklist(Linklist head,int n) //在链表中查找元素n
{
Linklist p=head;
int i=0; //i是此元素的位置
while(p->next && p->next->data!=n)
{
p=p->next;
i++;
}
if(! (p->next) )
return -1; //没找到此元素
return i+1;
}
void destroyLinklist(Linklist *head) //销毁链表
{
Linklist p=*head,q;
while( p )
{
q=p;
p=p->next;
free(q);
}
p=NULL;
printf("销毁成功.\n");
}
void print(Linklist head) //打印链
{
Linklist p=head;
if( !(head->next) )
{
printf("NULL");
return;
}
while(p->next)
{
printf("%d ",p->next->data);
p=p->next;
}
}
void menu()
{
printf("\n*******************\n");
printf("1.向链表插入元素.\n");
printf("2.删除连表中的元素.\n");
printf("3.销毁链表.\n");
printf("4.在链表中查找元素.\n");
printf("5.打印链表.\n");
printf("6.退出.\n");
printf("请输入你的选择:");
}
int selecte(Linklist head)
{
int n,flag=1,e=0;
menu();
scanf("%d",&n);
printf("\n");
while(n<1 || n>6)
{
printf("输入错误,请重新输入:");
scanf("%d",&n);
printf("\n");
}
switch(n)
{
case 1: printf("请输入你要插入的元素(-1 exit)\n:");
scanf("%d",&e);
while(e !=-1)
{
insertLinklist(head,e);
scanf("%d",&e);
}
printf("\n插入完成.\n");
break;
case 2: printf("请输入你要删除的元素的位置(>=1):");
int i,r;
scanf("%d",&i);
r=deleteLinklist(head,i);
if(r==-1)
{
printf("删除位置出错.\n");
break;
}
printf("删除的元素的:%d\n",r);
break;
case 3: destroyLinklist(&head);
break;
case 4: printf("请输入你要查找的元素:");
int m;
scanf("%d",&m);
r=searchLinklist(head,m);
if(r==-1)
{
printf("\n链表中无此元素.\n");
break;
}
printf("此元素在链表中第一次出现的位置是:%d\n",r);
break;
case 5: printf("链表的元素分别是:");
print(head);
printf("\n");
break;
case 6: flag=0;
}
return flag;
}
int main()
{
Linklist head=NULL;
initLinklist(&head);
int flag=selecte(head);
while(flag)
flag=selecte(head);
printf("*******谢谢使用*******\n");
return 1;
}