刚学数据结构(c语言版),不是特别明白,网课也没怎么看懂,自己敲了几个小时也没结果,希望能解答一下。
4条回答 默认 最新
- 摁回车的大雷 2022-08-23 08:46关注
题主你好:
代码如下:
#include<stdio.h> #include<stdlib.h> typedef struct node_t { int data; struct node_t* next; }LinkNode_t; LinkNode_t* createLinkList(); int emptyLinkList(LinkNode_t* p); int lengthLinkList(LinkNode_t* p); int insertLinkList(LinkNode_t* p,int pos,int x); void printLinkList(LinkNode_t* p); int getLinkList(LinkNode_t* p,int pos); int deleteLinkList(LinkNode_t* p,int pos); void clearLinkList(LinkNode_t* p); void ReversePrintList(LinkNode_t* p); int main() { LinkNode_t* head = createLinkList();//创建一个链表的空头结点 printf("(1)建立线性表(a,b,c,d,e,f,g,h,i,j)\n"); int i; for(i='a';i<='j';i++) { insertLinkList(head,i-'a',i);//在i-'a'位置插入i } //a,b,c,d,e,f,g,h,i,j printf("(2)把线性表的所有元素输出到屏幕上\n"); printLinkList(head); printf("(3)从线性表中输出元素g\n"); printf("%c\n",getLinkList(head,6)); printf("(4)在线性表的第5个元素前插入y元素\n"); insertLinkList(head,4,'y');//插入y //a,b,c,d,y,e,f,g,h,i,j printf("(5)从线性表中删除第三个元素并把它输出到屏幕上\n"); printf("%c\n",getLinkList(head,2)); deleteLinkList(head,2); //a,b,d,y,e,f,g,h,i,j printf("(6)最后把线性表的所有元素再次输出到屏幕上\n"); printLinkList(head); deleteLinkList(head,0);//删除链表 return 0; } /* 功能:创建一个链表的空头结点(堆空间)返回头结点的地址 参数:新结点的值 返回值:空链表的头结点指针 */ LinkNode_t* createLinkList() { LinkNode_t* node =(LinkNode_t*)malloc(sizeof(LinkNode_t)); node->next = NULL; return node; } /* 功能:判断链表是否为空 参数:链表头结点指针 返回值:空返回1 非空返回0 */ int emptyLinkList(LinkNode_t* p) { return p->next == NULL; } /* 功能:计算链表中除空头结点之外的结点个数 参数:链表头结点指针 返回值:结点个数 */ int lengthLinkList(LinkNode_t* p) { int count = 0; LinkNode_t* t = p->next; while(t!=NULL) { count++; t = t->next; } return count; } /* 功能:在链表中插入新结点并存入数据 参数1:链表头结点指针 参数2:插入的位置(第一个有数据的结点位置为0) 参数3:新结点的值 返回值:成功返回0 失败返回-1 */ int insertLinkList(LinkNode_t* p,int pos,int x) { if(pos<0||pos>lengthLinkList(p)) { return -1; } LinkNode_t* newNode = (LinkNode_t*)malloc(sizeof(LinkNode_t)); newNode->data = x;//赋值 newNode->next = NULL; LinkNode_t* t=p;//指向空头,从空头开始遍历 int i; for(i = 0;i < pos;i++) { t = t->next; } //将结点插入链表 newNode->next = t->next; t->next = newNode; return 0; } /* 功能:获得链表中某结点的值 参数1:链表头结点指针 参数2:位置(第一个有数据的结点位置为0) 返回值:失败返回-1 成功返回参数2位置结点的值 */ int getLinkList(LinkNode_t* p,int pos) { if(pos<0||pos>lengthLinkList(p)) { return -1; } int i; LinkNode_t* t = p->next; for(i=0;i<pos;i++) { t = t->next; } return t->data; } /* 功能:遍历输出链表中结点的值 参数:链表头结点指针 返回值:无 */ void printLinkList(LinkNode_t* p) { printf("有效数据结点数:%d\n",lengthLinkList(p)); int count = 0; LinkNode_t* t = p->next; while(t!=NULL) { printf("NODE[%d]:%c\n",count,t->data); t = t->next; count++; } } /* 功能:删除参数位置结点 参数1:链表头结点指针 参数2:删除位置 返回值:失败返回-1 成功返回0 */ int deleteLinkList(LinkNode_t* p,int pos) { if(pos<0||pos>=lengthLinkList(p)) { return -1; } int i; LinkNode_t* t = p;//指向空头 for(i=0;i<pos;i++) { t = t->next; } LinkNode_t* s = t->next;//保存要删除结点的地址 t->next = t->next->next;//连接待删除结点的前后两个结点 free(s); return 0; } /* 功能:清空链表 参数:链表头结点指针 */ void clearLinkList(LinkNode_t* p) { while(p!=NULL) { LinkNode_t* t = p; p = p->next; free(t); } } /* 功能:反向打印链表 参数:链表头结点指针 */ void ReversePrintList(LinkNode_t* p) { static int count=0; if(p->next!=NULL) { count++; ReversePrintList(p->next); count--; printf("NODE[%d]:%d\n",count,p->next->data); return; } return; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 帮我写一个c++工程
- ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
- ¥15 关于smbclient 库的使用
- ¥15 微信小程序协议怎么写
- ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
- ¥20 怎么用dlib库的算法识别小麦病虫害
- ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
- ¥15 java写代码遇到问题,求帮助
- ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
- ¥15 有了解d3和topogram.js库的吗?有偿请教