熟练进行链表的基本操作,编程实现动态链表的建立 插入 删除和输出操作
这个实验不怎么会,想问问朋友们
熟练进行链表的基本操作,编程实现动态链表的建立 插入 删除和输出操作这个实验不怎么会
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- qzjhjxj 2022-11-22 13:31关注
供参考:
#include <malloc.h> #include <stdio.h> typedef int ElemType; typedef struct node { ElemType data; //数据域 struct node* next; //指针域 } SLinkNode; //单链表类型 void DestroyList(SLinkNode*& L) //销毁单链表L { SLinkNode* pre = L, * p = pre->next; while (p != NULL) { free(pre); pre = p; p = p->next; } free(pre); } int GetLength(SLinkNode* L) //求单链表L的长度 { int i = 0; SLinkNode* p = L->next; while (p != NULL) { i++; p = p->next; } return i; } int GetElem(SLinkNode* L, int i, ElemType& e) //求第i个结点值e { int j = 0; SLinkNode* p = L; //p指向头结点,计数器j置为0 if (i <= 0) return 0; //参数i错误返回0 while (p != NULL && j < i) { j++; p = p->next; } if (p == NULL) return 0; //未找到返回0 else { e = p->data; return 1; //找到后返回1 } } int Locate(SLinkNode* L, ElemType e) //求第一个值为e的结点的逻辑序号 { SLinkNode* p = L->next; int j = 1; //p指向第一个数据结点,j置为其序号1 while (p != NULL && p->data != e) { p = p->next; j++; } if (p == NULL) return(0); //未找到返回0 else return(j); //找到后返回其序号 } int InsElem(SLinkNode*& L, ElemType x, int i) //插入结点值为x的结点 { int j = 0; SLinkNode* p = L, * s; if (i <= 0) return 0; //参数i错误返回0 while (p != NULL && j < i - 1) //查找第i-1个结点*p { j++; p = p->next; } if (p == NULL) return 0; //未找到第i-1个结点时返回0 else //找到第i-1个结点p { s = (SLinkNode*)malloc(sizeof(SLinkNode)); s->data = x; //创建存放元素x的新结点s s->next = p->next; //将s结点插入到p结点之后 p->next = s; return 1; //插入运算成功,返回1 } } int DelElem(SLinkNode*& L, int i) //删除第i个结点 { int j = 0; SLinkNode* p = L, * q; if (i <= 0) return 0; //参数i错误返回0 while (p != NULL && j < i - 1) //查找第i-1个结点 { j++; p = p->next; } if (p == NULL) return 0; //未找到第i-1个结点时返回0 else //找到第i-1个结点p { q = p->next; //q指向被删结点 if (q == NULL) return 0; //没有第i个结点时返回0 else { p->next = q->next; //从单链表中删除q结点 free(q); //释放其空间 return 1; } } } void DispList(SLinkNode* L) //输出单链表 { SLinkNode* p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } //采用头插法建表的算法 void CreateListF(SLinkNode*& L, ElemType a[], int n) { SLinkNode* s; int i; L = (SLinkNode*)malloc(sizeof(SLinkNode)); //创建头结点 L->next = NULL; //头结点的next域置空,表示一个空单链表 for (i = 0; i < n; i++) //遍历a数组所有元素 { s = (SLinkNode*)malloc(sizeof(SLinkNode)); s->data = a[i]; //创建存放a[i]元素的新结点s s->next = L->next; //将s插在头结点之后 L->next = s; } } //采用尾插法建表的算法 void CreateListR(SLinkNode*& L, ElemType a[], int n) { SLinkNode* s, * tc; int i; L = (SLinkNode*)malloc(sizeof(SLinkNode)); //创建头结点 tc = L; //tc始终指向尾结点,开始时指向头结点 for (i = 0; i < n; i++) { s = (SLinkNode*)malloc(sizeof(SLinkNode)); s->data = a[i]; //创建存放a[i]元素的新结点s tc->next = s; //将s插入tc之后 tc = s; } tc->next = NULL; //尾结点next域置为NULL } int main() { SLinkNode* L = NULL, * L1 = NULL; ElemType n, a[20] = { 0 }, i, e; scanf("%d", &n); for (i = 0; i < n; i++)//(1)输入一组长度不超过20的整数元素 scanf("%d", &a[i]); //***使用头插法建立一个带头结点的单链表*** CreateListF(L, a, n);//(1)使用头插法建立一个带头结点的单向链表 printf("L:"); DispList(L); //(2)显示单链表 printf("L的长度:%d\n", GetLength(L)); //(2)显示单链表的长度 i = 3; GetElem(L, i, e); printf("第%d个位置的值:%d\n", i, e); //(3)显示第3个位置的值 e = 5; printf("元素%d的位置:%d\n", e, Locate(L, e));//(3)显示链表中某个元素是第几个位置 i = 4; e = 10; DelElem(L, i); //(4)删除第4个位置元素 InsElem(L, e, i);//(4)往第4个位置插入元素10 printf("L:"); DispList(L); //(4)显示单链表 //***使用尾插法建立一个带头结点的单链表*** printf("\n"); CreateListR(L1, a, n);//(1)使用尾插法建立一个带头结点的单向链表 printf("L1:"); DispList(L1); //(2)显示单链表 printf("L1的长度:%d\n", GetLength(L1)); //(2)显示单链表的长度 i = 3; GetElem(L1, i, e); printf("第%d个位置的值:%d\n", i, e); //(3)显示第3个位置的值 e = 5; printf("元素%d的位置:%d\n", e, Locate(L1, e));//(3)显示链表中某个元素是第几个位置 i = 4; e = 10; DelElem(L1, i); //(4)删除第4个位置元素 InsElem(L1, e, i);//(4)往第4个位置插入元素10 printf("L1:"); DispList(L1); //(4)显示单链表 return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报