python链表的创建 搜索和删除_数据结构学习(三)——单链表的操作之查找、删除、插入。...

创建链表的方法采用尾插法,且是改进版的尾插法,即添加了一个辅助头节点。

下面的代码是对插入、删除、查找的一个整体操作。其中查找分为按值和按位置查找。删除和插入都是按给定位置操作。

#include

#include

typedef struct list

{

char data;

struct list *next;

}linklist;

linklist *CreateLinklist_End();//尾插法创建链表

linklist *Linklist_FindPos(linklist *h, int pos);//通过位置查找节点

linklist *Linklist_FindDat(linklist *h, char dat, int *i);//按值查找节点

int Linklist_Insert(linklist *h, int pos, char dat);//按位置插入节点

int Linklist_Delete(linklist *h, int pos);//按位置删除节点

void ShowLinklist(linklist *h);//输出显示链表

int main(void)

{

linklist *head, *p;

int choice, pos, ans;

char dat;

printf("单链表的相关操作练习\n");

printf("尾插法创建一个链表,请依次输入节点字符数据,空格隔开('#'表示输入结束):\n");

head = CreateLinklist_End();

while(1)

{

printf(" 选择将要进行的操作\n");

printf("1.按位置查找节点\n");

printf("2,按值查找节点\n");

printf("3.按位置插入节点\n");

printf("4.按位置删除节点\n");

printf("5.输出显示链表\n");

printf("6.退出程序\n");

printf("做出选择:");

scanf("%d", &choice);

getchar();//消除回车键对后面输入带来的影响.

switch(choice)

{

case 1:

printf("输入想要查找节点的位置:");

scanf("%d", &pos);

p = Linklist_FindPos(head, pos);

if(p)

printf("第%d个节点数据为:%c\n", pos, p->data);

else

printf("查找的节点不存在\n");

break;

case 2:

printf("输入想要查找的节点的字符数据:");

scanf("%c", &dat);

p = Linklist_FindDat(head, dat, &pos);

if(p)

{

printf("你查找的节点所在数据为:%c\n", p->data);

printf("节点所在的位置为:%d\n", pos);

}

else

{

printf("你查找的节点不存在!\n");

}

break;

case 3:

printf("请输入你想插入的节点字符数据及位置(空格隔开):");

scanf("%c %d", &dat, &pos);

ans = Linklist_Insert(head, pos, dat);

if(ans)

printf("插入节点成功!\n");

else

printf("插入节点失败\n");

break;

case 4:

printf("请输入你想删除节点所在的位置:");

scanf("%d", &pos);

ans = Linklist_Delete(head, pos);

if(ans)

printf("删除节点成功!\n");

else

printf("删除节点失败!\n");

break;

case 5:

printf("节点数据依次为:");

ShowLinklist(head);

break;

case 6:

return 0;

break;

default:

printf("输入的选择无效!\n");

break;

}

}

}

//尾插法创建链表

linklist *CreateLinklist_End()

{

linklist *head, *p, *e;

char ch;

head = (linklist*)malloc(sizeof(linklist));

e = head;

ch = getchar();

getchar();//消除空格带来的影响

while(ch != '#')

{

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

p->data = ch;

e->next = p;

e = p;

ch = getchar();

getchar();//消除空格带来的影响

}

e->next = NULL;

return head;

}

//通过位置查找节点

linklist *Linklist_FindPos(linklist *h, int pos)

{

linklist *p;

int i = 1;

p = h->next;

while(i

{

p = p->next;

i++;

}

if(i == pos)//找到指定位置

return p;

else

return NULL;

}

//通过数据查找节点

linklist *Linklist_FindDat(linklist *h, char dat, int *i)

{

linklist *p;

p = h->next;

*i = 1;

while(p != NULL)

{

if(p->data != dat)

{

*i = *i + 1;

p = p->next;

}

else

break;//找到数据则跳出

}

return p;

}

//在指定位置插入节点

int Linklist_Insert(linklist *h, int pos, char dat)

{

linklist *p, *l;

int i=0;

p = h;

while(inext != NULL)//找到位置前一个节点

{

i++;

p = p->next;

}

if(i == pos-1)//找到指定位置

{

l = (linklist*)malloc(sizeof(linklist));

l->data = dat;

l->next = p->next;

p->next = l;

}

else

return 0;

return 1;

}

//删除指定位置节点

int Linklist_Delete(linklist *h, int pos)

{

linklist *p, *s;

int i = 0;

p = h;

while(inext != NULL)//搜索指定位置前一个节点

{

i++;

p = p->next;

}

if(i != pos-1 || p->next == NULL)//查找位置非法

return 0;

s = p->next;

p->next = s->next;

free(s);

return 1;

}

//输出显示节点

void ShowLinklist(linklist *h)

{

linklist *p;

p = h->next;

while(p != NULL)

{

printf("%c ", p->data);

p = p->next;

}

printf("\n");

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您讲解链表的实现。 链表是一种非常常见的数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表的头节点不包含数据元素,也没有前驱节点,只有后继节点。 下面我们来实现一个链表,并在链表上实现插入删除查找操作。 首先,定义一个节点类: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next ``` 每个节点包含一个 val 属性和一个 next 属性,分别表示节点的值和指向下一个节点的指针。 接下来,定义一个链表类: ```python class LinkedList: def __init__(self): self.head = ListNode() ``` 链表的头节点不包含数据元素,也没有前驱节点,只有后继节点。所以我们在初始化链表时,创建一个空的头节点。 接下来,我们来实现插入操作插入操作分为两种情况: 1. 在链表的头部插入一个节点 2. 在链表的中间或尾部插入一个节点 在链表的头部插入一个节点,可以通过以下代码实现: ```python def insertAtHead(self, val): node = ListNode(val) node.next = self.head.next self.head.next = node ``` 首先,创建一个新的节点,并将它的 next 指针指向当前头节点的后继节点。然后将头节点的 next 指针指向新的节点。 在链表的中间或尾部插入一个节点,可以通过以下代码实现: ```python def insertAtTail(self, val): p = self.head while p.next: p = p.next node = ListNode(val) p.next = node ``` 首先,遍历链表找到最后一个节点。然后,创建一个新的节点,并将最后一个节点的 next 指针指向新的节点。 接下来,我们来实现删除操作删除操作也分为两种情况: 1. 删除链表的头节点 2. 删除链表的中间或尾部节点 删除链表的头节点,可以通过以下代码实现: ```python def deleteAtHead(self): if self.head.next: self.head.next = self.head.next.next ``` 首先,判断链表是否为空。如果链表不为空,将头节点的 next 指针指向当前头节点的后继节点的后继节点。 删除链表的中间或尾部节点,可以通过以下代码实现: ```python def deleteAtTail(self): p = self.head while p.next and p.next.next: p = p.next if p.next: p.next = None ``` 首先,遍历链表找到倒数第二个节点。然后,将倒数第二个节点的 next 指针指向 None。 最后,我们来实现查找操作查找操作可以通过以下代码实现: ```python def search(self, val): p = self.head.next while p: if p.val == val: return True p = p.next return False ``` 首先,从头节点的后继节点开始遍历链表。如果找到了值为 val 的节点,则返回 True。如果遍历完整个链表都没有找到值为 val 的节点,则返回 False。 好了,以上就是链表的实现和插入删除查找操作的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值