1.动态单链表的创建(creat)
链表各类操作详解
百度传课之C语言启蒙
(1)开辟动态内存的C标准库函数:malloc(),free()。
(2)开辟动态内存的C/C++标准运算符:new,delete,(C++中最好用new,delete运算符而不用malloc(),free()函数)。
C语言创建的代码实现:
struct Student*creat(void)
{
struct Student*head;
struct Student*p1,*p2;
n=0;
p1=p2=malloc(struct Student*)malloc(sizeof(struct Student));
scanf("%d,%f",&p1->num,&p1->score);
head=NULL;
while(p1->num!=0)
{n=n+1;
if(n==1)head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct Student*)malloc(sizeof(struct Student));
scanf("%d,%f",&p1->num,&p2->score);
}
p2->next=NULL;
return(head);
}
c++语言代码实现如下:
void add(student *head)//录入学生信息
{
char n='1';
student *p = head;
student *p2;
while(n!='0')
{
p2 = new student;cout << "请输入录入学生的信息(录入完成后按0结束录入,按任意键继续录入)" << endl;
cout << "学号:";
cin >> p2->num;
cout << "姓名:";
cin >> p2->name;
cout << "地址:";
cin >> p2->dizhi;
cout << "电话:";
cin >> p2->phone;
while (p->next!= NULL)
{
if(strcmp(p->num,p2->num)==0)
{cout<<"此学生已经存在"
}
p->next = p2;
p2->next = NULL;
cout<
动态链表的输出:
voidPrint(structstudent *head)
{
structstudent *p;
printf ("\nNow , These %d records are:\n", n);
p = head;
if(head != NULL)//只要不是空链表,就输出链表中所有节点
{
printf("head is %o\n", head);//输出头指针指向的地址
do
{
/printf ("%o %d %5.1f %o\n", p, p->num, p->score, p->next);
p = p->next;//移到下一个节点
}
while(p != NULL);
}
}
链表的删除和插入操作:
- 删除操作代码:
structstudent *Del (structstudent *head,intnum)
{
structstudent *p1;//p1保存当前需要检查的节点的地址
structstudent *p2;//p2保存当前检查过的节点的地址
if(head == NULL)//是空链表(结合图3理解)
{
printf ("\nList is null!\n");
return head;
}
//定位要删除的节点
p1 = head;
while(p1->num != num && p1->next != NULL)//p1指向的节点不是所要查找的,并且它不是最后一个节点,就继续往下找
{
p2 = p1;//保存当前节点的地址
p1 = p1->next;//后移一个节点
}
if(p1->num==num)//找到了。(结合图4、5理解)
{
if(p1 == head)//如果要删除的节点是第一个节点
{
head = p1->next;//头指针指向第一个节点的后一个节点,也就是第二个节点。这样第一个节点就不在链表中,即删除
}
else//如果是其它节点,则让原来指向当前节点的指针,指向它的下一个节点,完成删除
{
p2->next = p1->next;
}
free (p1);//释放当前节点
p1 = NULL;
printf ("\ndelete %ld success!\n", num);
n -= 1;//节点总数减1个
}
else//没有找到
{
printf ("\n%ld not been found!\n", num);
}
return head;
}
2)插入操作代码:
void insert(struct student *phead,char *name)
{
struct student *pfront,*pback,*pnew;
pnew=(struct student*)malloc(sizeof(struct student));
printf("请输入新结点的姓名和年龄:\n");
scanf("%s%d",pnew->name,pnew->age);
pback=phead;
pfront=phead->next;
while(pfront!=NULL)
{
if(strcmp(name,pfront->name)==0)
{
pback->next=pnew;
pnew->next=pfront;
}
else
{
pback=pfront;
pfront=pfront->next;
}
}
//如果未找到要插入的结点,将新节点插入在链表最后一个
pback->next=pnew;
pnew->next=NULL;
}
链表的冒泡排序:
struct student *BubbleSort (struct student *head)
{
struct student *endpt; //控制循环比较
struct student *p; //临时指针变量
struct student *p1,*p2;
p1 = (struct student *) malloc (LEN);
p1->next = head; //注意理解:我们增加一个节点,放在第一个节点的前面,主要是为了便于比较。因为第一个节点没有前驱,我们不能交换地址
head = p1; //让head指向p1节点,排序完成后,我们再把p1节点释放掉
for (endpt = NULL; endpt != head; endpt = p) //结合第6点理解
{
for (p = p1 = head; p1->next->next != endpt; p1 = p1->next)
{
if (p1->next->num > p1->next->next->num) //如果前面的节点键值比后面节点的键值大,则交换
{
p2 = p1->next->next; //结合第1点理解
p1->next->next = p2->next; //结合第2点理解
p2->next = p1->next; //结合第3点理解
p1->next = p2; //结合第4点理解
p = p1->next->next; //结合第6点理解
}
}
}
p1 = head; //把p1的信息去掉
head = head->next; //让head指向排序后的第一个节点
free (p1); //释放p1
p1 = NULL; //p1置为NULL,保证不产生“野指针”,即地址不确定的指针变量
return head;
}