数据结构--单链表的基本操作

来源:互联网 发布:数据恢复 被覆盖 恢复 编辑:程序博客网 时间:2024/05/20 18:19

链表定义:n 个节点离散分配,彼此之间通过指针相连, 每个节点只有一个前驱节点和一个后驱节点, 首节点没有前驱节点, 尾节点没有后驱节点。

链表的基本操作:

包括: 求长度, 插入数据, 删除数据, 遍历等

下面是代码演示:

# include <stdio.h># include <stdlib.h>typedef struct stu{int date;struct stu * pNext;}NODE, * PNODE;PNODE create_list();// 创建一个链表void traveral_list(PNODE pHead);// 遍历整个链表int insert_list(PNODE pHead);// 插入数据int delete_list(PNODE pHead, int *val);// 删除数据void length_list(PNODE pHead);// 计算链表长度int main(void){PNODE pHead;// pHead 用来保存头结点int val;// val 用来保存删除的元素pHead = create_list();traveral_list(pHead);length_list(pHead);if (insert_list(pHead))printf("插入数据成功\n");traveral_list(pHead);if (delete_list(pHead, &val))printf("删除节点成功\n");traveral_list(pHead);return 0;}PNODE create_list(){PNODE pHead = (PNODE)malloc(sizeof(NODE));// pHead 指向头节点。int len, i, val;// len 用来表示链表的长度。printf("请输入您需要的链表长度:len = ");scanf("%d", &len);PNODE pTail = pHead;// 建立一个临时指针pTail->pNext = NULL;for (i = 0; i < len; i++){printf("请输入你要给第%d个链表的数值:", i+1);scanf("%d", &val);PNODE pNew = (PNODE)malloc(sizeof(NODE));// pNew 指向新建的节点。pNew->date = val;// 给新建立的节点赋值。pTail->pNext = pNew;// 使得前一个节点的指针域指向后一个节点。pTail = pNew;// pTail 也指向新建立的节点。pTail->pNext = NULL;// 使得新建立的节点的指针域为NULL}printf("链表建立成功\n\n");return pHead;}void traveral_list(PNODE pHead){PNODE p = pHead->pNext;// p 指向首节点printf("开始遍历整个链表\n");while (NULL != p){printf("%d ", p->date);p = p->pNext;}printf("\n遍历完成\n\n");return;}int insert_list(PNODE pHead){int pos, val;int i = 0;PNODE p = pHead;// p 指向头结点。printf("请输入您要在第n个节点前面增加的数据(中间以空格隔开):\n");scanf("%d %d", &pos, &val);while (NULL != p && i < pos - 1){p = p->pNext;i++;}if (i > pos - 1 || p == NULL)return 0;PNODE pNew = (PNODE)malloc(sizeof(NODE));PNODE q = p->pNext;// q 也指向pos个指针。p->pNext = pNew;pNew->pNext = q;pNew->date = val;return 1;}int delete_list(PNODE pHead, int *pVal){int i = 0, pos;PNODE p = pHead;printf("请输入您想删除的节点数:pos = ");scanf("%d", &pos);while (NULL != p && i < pos - 1){p = p->pNext;i++;}if (i > pos - 1 || p == NULL)return 0;PNODE q = p->pNext;// 建立一个临时指针*pVal = q->date;p->pNext = p->pNext->pNext;free(q);// 把删除的节点free掉q = NULL;printf("您删除的元素是: %d\n", *pVal);// 输出删除的元素return 1;}void length_list(PNODE pHead){int i = 0;PNODE p = pHead->pNext;while (NULL != p){p = p->pNext;i++;}printf("链表的长度为%d\n\n", i);return;}

运行结果如下图:



原创粉丝点击