标签:链表 sizeof 实现 new 删除 while type splay address
#include<stdio.h> #include<stdlib.h> typedef struct Node { int data; struct Node *next; } node; /*初始化链表: 1.首先给头指针分配空间,将头指针赋给temp 2.其次给每一个元素分配空间 3.将内容赋给当前节点的data,NULL赋给当前节点的next指针 4.把当前节点赋给(头指针)上一个节点的next指针 5.上一节点指针后移,准备初始化下个元素 6.最后返回当前链表的头指针*/ node *initnode() { int i; node *p = (node*)malloc(sizeof(node)); node *temp = p; for (i = 0; i < 10; i++) { node *a = (node*)malloc(sizeof(node)); a->data = i; a->next = NULL; temp->next = a; temp = temp->next; } return p; } /*指定位置插入元素: 1.将头指针赋给temp 2.temp一直遍历直到指定位置 3.给需要插入的元素分配空间,并将内容赋给分配好空间的元素 4.将插入位置的后一元素赋给要插入元素的next指针 5.将插入元素赋给temp的next指针 6.最后返回当前链表的头指针*/ node *insertElem(node *p, int elem, int pos) { int i; node *temp = p; for ( i = 0; i < pos; i++) { temp = temp->next; } node *c = (node*)malloc(sizeof(node)); c->data = elem; c->next = temp->next; temp->next = c; return p; } /*删除指定位置的元素: 1.将头指针赋给temp 2.temp一直遍历直到指定位置 3.声明一个变量代表待删除节点 4.将待删除节点的下一节点赋给待删除节点的上一节点的next指针 5.释放待删除节点空间 6.最后返回当前链表的头指针*/ node *delElem(node *p, int pos) { int i; node *temp = p; for ( i = 0; i < pos; i++) { temp = temp->next; } node *c = temp->next; temp->next = c->next; free(c); return p; } /*查询指定元素的位置: 1.将头指针赋给temp 2.temp一直遍历直到temp节点的值等于要查询的元素 3.返回当前节点的index 4.如果链表遍历结束也未找到指定节点,返回-1 */ int selectElem(node *p, int elem) { node *temp = p; int i = 0; while (temp->next) { temp = temp->next; if (temp->data == elem) { return i; } i++; } return -1; } /*更新链表指定节点的值*/ node *amendElem(node *p, int pos, int newElem) { int i; node *temp = p; for ( i = 0; i < pos; i++) { temp = temp->next; } node *amend = temp->next; amend->data = newElem; return p; } /*遍历链表*/ void display(node *p) { node *temp = p; while (temp->next) { temp = temp->next; printf("%d ", temp->data); } printf("\n"); } //以下内容来自《数据结构与算法-C语言描述》 int IsEmpty(node *p) { return p->next==NULL; } int IsLast(node *pos,node *p) { return pos->next==NULL; } //删除指定位置的元素 node *Delete(node *p,int elem) { node *temp=p; node *tmp; while(temp->next) { if(temp->next->data==elem) { tmp=temp->next; temp->next=tmp->next; free(tmp); } temp=temp->next; } return p; } //在指定位置插入元素 node *Insert(node *p,int pos,int elem) { node *temp=p; int i; for(i=0; i<pos; i++) { temp=temp->next; } node *cell =(node*)malloc(sizeof(node)); cell->data=elem; cell->next=temp->next; temp->next=cell; return p; } //删除list void DeleteList(node *p) { node *temp=p; node *tmp; p->next=NULL; while(temp->next) { tmp=temp->next; free(tmp); temp=temp->next; } } int main() { node *p = initnode(); display(p); printf("在第4的位置插入元素5:\n"); p = Insert(p, 4, 5); display(p); printf("删除第3个元素:\n"); p = delElem(p, 3); display(p); printf("查找元素2的位置为:\n"); int address = selectElem(p, 2); if (address == -1) { printf("没有该元素\n"); } else { printf("元素2的位子为:%d\n", address); } printf("更改第3的位置的数为7:\n"); p = amendElem(p, 3, 7); display(p); printf("delete7\n"); p=Delete(p,7); display(p); printf("删除\n"); DeleteList(p); display(p); }
标签:链表 sizeof 实现 new 删除 while type splay address
原文地址:https://www.cnblogs.com/wangbin2188/p/9593669.html