数据结构—线性结构链表2

    科技2024-06-11  70

    1、算法 (1)狭义的算法与数据的存储方式密切相关 (2)广义的算法是与数据的存储方式无关 泛型: 利用某种技术达到的效果就是:不同的存数方式,执行操作是一样的

    2、链表实现排序、插入、删除等功能的算法实现(C语言)

    #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <stdbool.h> typedef struct Node { int data; struct Node * pNext; }NODE,*PNODE; PNODE creat_list(); void traverse_list(); bool empty_list(); bool insert_list(PNODE,int ,int ); int length_list(PNODE); bool delete_list(PNODE,int ,int * ); void sort_list(PNODE); int main(void) { PNODE pHead = NULL; pHead = creat_list();//创建一个非循环单链表,将链表的头结点地址给pHead traverse_list(pHead); //insert_list(pHead,-3,2); int val; if(delete_list(pHead,4,&val)) { printf("删除成功,删除的元素是%d\n", val); } else { printf("删除失败,不存在该元素"); } traverse_list(pHead); /* int len = length_list(pHead); printf("链表的长度是%d\n",len); if(empty_list(pHead)) { printf("链表为空!\n"); }else { printf("链表不空\n"); } sort_list(pHead); traverse_list(pHead); */ return 0; } PNODE creat_list(void) { int len;//存放有效节点的个数 int i; int val;//存放临时存放用户输入结点的值 //分配一个不存放有效数据的头结点 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(NULL == pHead) { printf("内存分配失败!程序终止!\n"); exit(-1); } PNODE pTail = pHead; pTail->pNext = NULL; printf("输入链表节点个数:"); scanf("%d",&len); for(i = 0;i<len;++i) { printf("请输入第%d个节点的值:",i+1); scanf("%d",&val); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("内存分配失败!程序终止!\n"); exit(-1); } pNew->data = val; // pHead->pNext = pNew; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew; } return pHead; } void traverse_list(PNODE pHead) { PNODE p = pHead->pNext; while(NULL != p) { printf("%d ",p->data); p = p->pNext; } printf("\n"); } bool empty_list(PNODE pHead) { if(NULL == pHead->pNext) return true; else return false; } int length_list(PNODE pHead) { PNODE p = pHead->pNext; int len = 0; while(NULL != p) { len++; p = p->pNext; } return len; } void sort_list(PNODE pHead) { int i,j,t; PNODE p,q; int len = length_list(pHead); for(i = 0,p = pHead->pNext; i<len-1; i++,p = p->pNext) { for(j=i+1,q = p->pNext; j<len; j++,q = q->pNext) { if(p->data > q->data) { t = p->data; p->data = q->data; q->data = t; } } } } //在pHead所指向的链表的第pos个节点的前面插入一个新的结点,该节点的值是val bool insert_list(PNODE pHead,int pos,int val) { int i = 0; PNODE p = pHead; while(NULL != p && i<pos-1) { p = p->pNext; ++i; } if(i>pos-1||NULL==p) return false; PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew) { printf("动态内存分配失败!/n"); exit(-1); } pNew->data = val; PNODE q = p->pNext; p->pNext = pNew; pNew->pNext = q; return true; } //删除节点 bool delete_list(PNODE pHead,int pos,int * pVal) { int i = 0; PNODE p = pHead; while(NULL != p->pNext && i<pos-1) { p = p->pNext; ++i; } if(i>pos-1||NULL==p) return false; PNODE q = p->pNext; *pVal = q->data; p->pNext = p->pNext->pNext; free(q); q = NULL; return true; }

    注意:codeblocks中不能直接使用bool关键字,在头文件加上“#include <stdbool.h>”头文件即可使用

    Processed: 0.010, SQL: 8