您的位置:首页 > 其它

单链表的创建、插入、删除、倒置操作

2009-12-02 20:40 387 查看
/*---------------------------------------------------*/

/*--------------单链表的创建、插入、删除、倒置操作-----------*/

/*--------------Written by redfire250-----2005.5.10----*/

/*-----------------------------------------------------*/

#include<malloc.h>

#include<stdio.h>

#define null 0

struct student

{

long Number;

char Name[20];

long Score;

struct student *Next;

};

int n=0;/*n为全局变量,用来计算链表的结点个数*/

/*-----------------------------------------*/

/*--------------创建结点函数Creat()--------*/

/*-----------------------------------------*/

struct student *Creat()

{

struct student *p1;

struct student *p2;

struct student *head=null;

p1=p2=(struct student *)malloc(sizeof(struct student));/*开辟一段可用内存单元*/

printf("please input the student's Number Name and the Score:\n");

scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);

while(p2->Number!=0)

{

n++;

if(n==1) /*是否开辟的是第一个结点*/

head=p2;

else

p1->Next=p2;

p1=p2;

p2=(struct student *)malloc(sizeof(struct student));

printf("Input the Number the Name and the Score:\n");

scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);

}

p1->Next=null;

return(head);

}

/*------------------------------------------*/

/*--------------查看链表内容函数View()------*/

/*------------------------------------------*/

View(struct student *head)

{

struct student *p;

p=head;

while(p->Next!=null)

{

printf("%ld %s %ld\n",p->Number,p->Name,p->Score);

p=p->Next;

}

printf("%ld %s %ld\n",p->Number,p->Name,p->Score);

}

/*-------------------------------------------------*/

/*--------------插入结点函数(前插)Insert()-------*/

/*-------------------------------------------------*/

Insert(struct student *head,int Num) /*head为链表头指针,Num插入链表位置*/

{

int t=1;

struct student *p1,*p2;

p1=head;

if (Num>n||Num<0)

{

printf("input error!!!\n");

return 0;

}

while(t<Num-1) /*找到要插入结点的前一个结点*/

{

p1=p1->Next;

t++;

}

p2=(struct student *)malloc(sizeof(struct student));

printf("Input the Number the Name and the Score:\n");

scanf("%ld%s%ld",&p2->Number,p2->Name,&p2->Score);

p2->Next=p1->Next;

p1->Next=p2;

n++;

}

/*------------------------------------------*/

/*------------ 删除结点函数Delnode()--------*/

/*-----------------------------------------*/

Delnode(struct student *head,int node)

{

int t=1;

struct student *p1,*p2;

p2=head;

if (node>n||node<1)

{

printf("error!!! The node is not exist!");

return 0;

}

while(t<node-1) /*找到要删除结点的前一个结点*/

{

p2=p2->Next;

t++;

}

p1=p2->Next->Next; /*找到要删除结点的后一个结点*/

free(p2->Next); /*释放要删除的结点空间(删除)*/

p2->Next=p1; /*前一结点指向后一结点*/

n--;

}

/*-------------------------------------------------*/

/*--------------逆序重组链表Invert()-------*/

/*-------------------------------------------------*/

struct student *Invert(struct student *head)

{

struct student *p1,*p2;

p1=head;

p2=p1->Next;

head=p2->Next;

p1->Next=null;

while(head->Next!=null)

{

p2->Next=p1;

p1=p2;

p2=head;

head=head->Next;

}

head->Next=p2;

p2->Next=p1;

return head;

}

main()

{

int number1,number2;

struct student *head;

head=Creat();

View(head);

printf("the n that you want to insert:\n");

scanf("%d",&number1);

Insert(head,number1);

View(head);

printf("the node that you want to DELETE:\n");

scanf("%d",&number2);

Delnode(head,number2);

View(head);

printf("Inverte the list:\n");

View(Invert(head));

getch();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: