动态链表的基本操作

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

}

}

链表的删除和插入操作:

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

你可能感兴趣的:(动态链表的基本操作)