单链表的创建及操作

1、单链表的结构体算法:

typedef char elemtype;
typedef struct node
{
elemtype data;           //数据域
struct node *next;       //指针域
}Lnode,*linklist;            //Lnode为结点类型,linklist为指向结点的指针类型

2、建立单链表

      (1)头插法(从表尾表头逆向建立)

                    算法思路:

                     (1)首先建立一个头结点h,并使头结点的指针域为空

                     (2)读入值

                     (3)建立一个新结点p

                     (4)将ch赋给p的数据域

                     (5)分别改变   新结点p的指针域   和  头结点h的指针域,使p成为h的直接后继

                     (6)重复(2)到(5),知道不满足循环条件为止

Lnode *creat()

{

elemtype ch;

Lnode *h, *p;


h = (Lnode *)malloc(sizeof(Lnode));   //建立头结点h

h->next = NULL;                       //使头结点的指针域为空


while ((ch=getchar())!='\n')

{

p = (Lnode *)malloc(sizeof(Lnode)); //建立新结点p

p->data = ch;                       //对p的数据域进行赋值 ch

p->next = h->next;                  //改变指针的状况

h->next = p;                        //h的直接后继是p

}

return h;

}

      (2)尾插法(从表头表尾建立)

Lnode *creat()

{

elemtype ch;

Lnode *h, *p, *t;

h = (Lnode *)malloc((sizeof(Lnode)));

h->next = NULL;


t = h;

while ((ch=getchar())!='\n')

{

p = (Lnode *)malloc(sizeof(Lnode));

p->data = ch;

p->next = NULL;


t->next = p;

t = p;                                      //t始终指向最后一个元素

}

return h;

}

3、求表长(结点个数)

           算法思路:

             (1)设置  一个指针变量p  和 一个整型变量i(做计数器)

             (2)让     p指向第一个结点,并i=0

             (3)指针p在单链表中后移,且i增加1

             (4)当   p=NULL时,单链表结束,计数完毕,i即表长

int lenth(Lnode *h)       //头指针
{
Lnode *p;
int i = 0;
p = h->next;          //p指向第一个结点

while (p)             //循环访问
{
i++;
p = p->next;      //p指针后移
}

return i;
}

4、插入

           p结点之后插入值为x的新结点s

           插入前后指针变化图解:


           算法思路:

            (1)生成一个新结点s

            (2)将x赋给新结点s的数据域

            (3)将新结点插入单链表中

           关键语句:

               s->next=p->next;

               p->next=s;

void insert(Lnode *p, elemtype x)            //将值为x的结点插入p之后
{
Lnode *s;
s = (Lnode *)malloc(sizeof(Lnode));


s->data = x;

s->next = p->next;                      //将新结点插入单链表中
p->next = s;

}

            拓展:在单链表中第i个元素之前插入一个元素的算法

int insert(Lnode *h, int i, elemtype x)

{

Lnode *p, *s;

int j = 0;

p = h;



while (p&&j<i-1)                //寻找第i-1号结点

{

p = p->next;

j++;

}



if (p)

{

p = (Lnode *)malloc(sizeof(Lnode));

s->data = x;

s->next = p->next;          //将s插入

p->next = s;

return 1;

}

else

{

return 0;

}

}

5、删除(删除p的后继结点q)

           

                算法思路:

                  (1)将q指向p结点的直接后继

                  (2)改变指针链接,把   q结点的直接后继作为p结点的直接后继

                  (3)删除q结点

                  (4)释放q结点空间

               关键语句:

                   q=p->next;

                   p->nextt=p->next;

void dele(Lnode *p)
{
Lnode *q;
if (p->next != NULL)
{
q = p->next;            //q为p的直接后继
p->next = q->next;      //删除q


free(q);                //释放q

}
}

6、查找

           算法思路:

             (1)从第一个结点开始遍历,将数据域与x比较

             (2)找到并返回该结点指针

Lnode *search(Lnode *h, elemtype x)
{
Lnode * p;

p = h->next;                 //从第一个结点开始


while (p&&p->data!=x)
{
p = p->next;             //没找到,指针向后移
}



return p;
}

7、取元素

          算法思路:

            (1)p从第一个结点出发,定义j=1

            (2)移动指针p,累积j 

            (3)查找j=i的结点

            (4)重复(2)到(3)直到p为空或指向第i个元素

Lnode *get(Lnode *h,int i)
{
Lnode *p;
int j=1;

p = h->next;

while (p&&j<i)
{
p = p->next;                 //移动指针p
j++;
}

if (i == j)
return p;                  //返回第i个元素的存储地址
else
{
return NULL;
}
}



























  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值