一、单链表的结点插入
(1)插入的结点位于空链表
(2)插入的结点位于非空链表
- 插入的链表位于非空链表的头部
- 插入的链表为与非空链表的尾部
- 插入的链表位于非空链表的中间部分
创建一个单链表结点的插入函数,将输入的学生的序号作为排序,按照从小到大的学号顺序插入学生信息
struct student *insert(struct student *head,struct student *new) /*定义插入节点函数 */
{
struct student *p1,*p2,*pnew;
p1 = p2 = head;
pnew = new;
if(head == NULL){
head = pnew ;
pnew->next = NULL;
}
else{
while((pnew->number > p1->number) && (p1->next !=NULL)){
p2 = p1; /* 不断移动指针 */
p1 = p1->next;
}
if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
{ pnew->next = p1; head = pnew; }
else /*插入位置位于链表中间*/
{p2->next = pnew; pnew->next = p1;}
}else{ /*插入位置位于链表的尾部 */
p1->next = pnew;
pnew = NULL ;
}
}
return (head);
}
二、单链表的结点删除
(1)判断要删除的链表是否为空链表
(2)判断要删除的结点是位于链表的表头、中间还是表尾。
创建一个函数用于删除学生的信息,判断学号位于链表中的哪个位置,然后进行删除
(struct student *)delete(struct student *head,int number) /* 删除链表结点的函数 */
{
struct student *p1,*p2;
p1 = p2 = head;
if(p1 == NULL){
printf("the list is empty\n"); /*输入的链表为空链表 */
}else
{
while((number != p1->number) && (p1->next != NULL)){
p2 = p1;
p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
}
if((number == p1->number)) {
if(p1 == head ){
head = p1->next; /* 要删除的结点位于表头 */
}else{
p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
}
}else{
printf("Don't have find the number\n"); /*没有找到要删除的结点 */
}
}
return (head);
}
综合实例:完成学生信息的写入,删除,排序,显示
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*定义链表结构内容*/
struct student
{
char name[10];
long int number;
struct student *next;
};
void putout(struct student *head);/*輸出链表中的内容*/
struct student *delete(struct student *head); /* 删除链表结点的函数 */
struct student *insert(struct student *head); /*定义插入节点函数 */
int get_line(char *cmd);
int main()
{
struct student *head;
char buf[20];
head = NULL;
system("clear");
while(1){
// system("clear");
printf("\n========================================\n\t\t学生信息功能表\n");
printf(" [1]查看学生信息\n");
printf(" [2]输入学生信息\n");
printf(" [3]删除学生信息\n");
printf("========================================\n\n");
printf("请输入命令:");
fflush(stdout);
scanf("%s",buf) ;
// get_line(buf);
switch(buf[0]){
case '1' :
putout(head);break;
case '2' :
head = insert(head);break;
case '3' :
head = delete(head);break;
default :
printf("输入错误\n");break;
}
}
return 0;
}
int get_line(char *cmd)
{
int i=0;
char temp;
memset(cmd,0,sizeof(cmd));
while (1) {
temp = getchar();
cmd[i]=temp;
if(cmd[i]==13 || cmd[i] == 10){
cmd[i]=0;
break;
}
fflush(stdout);
i++;
}
return 0;
}
struct student *insert(struct student *head) /*定义插入节点函数 */
{
struct student *p1,*p2,*pnew;
p1 = p2 = head;
pnew = (struct student *)malloc(sizeof(struct student ));
printf("请输入学生打姓名、学号,输入学号0则结束\n");
scanf("%s%ld",pnew->name,&pnew->number);
while(pnew->number >0){
if(head == NULL){
head = pnew ;
pnew->next = NULL;
}
else{
while((pnew->number > p1->number) && (p1->next !=NULL)){
p2 = p1; /* 不断移动指针 */
p1 = p1->next;
}
if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
{ pnew->next = p1; head = pnew; }
else /*插入位置位于链表中间*/
{ p2->next = pnew; pnew->next = p1;}
}else{ /*插入位置位于链表的尾部 */
p1->next = pnew;
pnew = NULL ;
}
}
pnew = (struct student *)malloc(sizeof(struct student ));
printf("请输入学生打姓名、学号,输入学号0则结束\n");
scanf("%s%ld",pnew->name,&pnew->number);
p2 = p1 = head;
}
free(pnew);
return (head);
}
struct student *delete(struct student *head) /* 删除链表结点的函数 */
{
struct student *p1,*p2;
int number;
p1 = p2 = head;
printf("please input the student nember\n");
scanf("%d",&number);
if(p1 == NULL){
printf("the list is empty\n"); /*输入的链表为空链表 */
}else
{
while((number != p1->number) && (p1->next != NULL)){
p2 = p1;
p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
}
if((number == p1->number)) {
if(p1 == head ){
head = p1->next; /* 要删除的结点位于表头 */
}else{
p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
}
}else{
printf("Don't have find the number\n"); /*没有找到要删除的结点 */
}
}
return (head);
}
/*輸出链表中的内容*/
void putout(struct student *head)
{
if(head == NULL) printf("暂无学生信息\n");
while(head!=NULL)
{
printf("name:%s\t number:%ld\n",head->name,head->number);
head = head->next;
}
}