美文网首页
动态链表的基本操作

动态链表的基本操作

作者: 小七饮酒 | 来源:发表于2018-11-10 14:13 被阅读0次

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<<endl;

n=getch();

}

cout<<"添加成功”<<endl;

save(head);

}

动态链表的输出:


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);

}

}

链表的删除和插入操作:

  1. 删除操作代码:

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;  
}  

相关文章

  • 动态链表的基本操作

    1.动态单链表的创建(creat) 链表各类操作详解百度传课之C语言启蒙 (1)开辟动态内存的C标准库函数:mal...

  • 玩转数据结构4-链表与递归

    上一节课主要学习了一种具有真正动态数据结构的数据结构——链表,实现了链表基本的增删改查等操作,基于链表的操作特性,...

  • C语言基础 之 链表操作

    链表的操作 对链表的主要操作有建立链表、结构的查找与输出、结点数据的删除和结点数据的插入示例 动态链表的建立 动态...

  • 数据结构-链表

    章节 动态数组 & 栈 & 队列 与 链表的不同 链表特性 & 图示 链表实现 & 各操作时间复杂度分析 动态数组...

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • java实现链表

    链表各个操作中,数据的删除比较特殊,其中具体操作如图所示: java实现动态链表代码: 具体的测试代码: 测试结果...

  • 线性表

    线性表的基本概念与实现 顺序表和链表的比较 顺序表的结构体定义和基本操作 链表的结构体定义和基本操作 线性表的基本...

  • 线性表

    1.线性表 1.1 顺序表(顺序存储) 静态分配 动态分配 1.2 单链表 单链表定义 不带头节点的单链表插入操作...

  • 单链表基本操作

    早前读YYCache源码时候 ,写过一篇文章 : YYCache源码解读,对源码中使用的LRU算法无比钦佩,其中涉...

  • Java实现静态链表

    今天复习到静态链表。自己简单实现了静态链表的基本操作,记录一下

网友评论

      本文标题:动态链表的基本操作

      本文链接:https://www.haomeiwen.com/subject/cvpzxqtx.html