自己实现的一个简单的链表,功能不是很全,而且有很重大的错误,就是一级指针是没办法修改之前传过来的指针的,所以要使用二级指针或者是返回指针
//总结:1.参数检查 对于插入操作等要检查插入位置等 对于删除操作要检查链表是否为空 // 2.创建链表可以不将创建所有的节点放在整个函数中,而是写一个类似的CreateNode(struct node* p_head, elemtype e)之类的函数 //链表的基本操作的实现,使用单个的函数实现逐个的操作 #include <stdio.h> #include <stdlib.h> #include <string.h> /////////////////////////////////// //创建链表 参数为头指针和新建节点的个数 int CreateLinkList(struct node* p_head, int n); //插入节点,参数为头指针,和插入位置。其中位置使用一个整数location来表达。 //对location参数要进行判断。 //1.loaction < 0抛出异常 2.location = 0这样插入的节点就成了第一个节点,注意转移头指针 3.loaction超过链表的节点个数,异常 int InsertNode(struct node* p_head, int location, int id); //获取链表的长度,就是节点的个数,参数为头指针 int GetLength(struct node* p_head); //打印整个链表 参数为头指针 void ShowLinkList(struct node* p_head); /////////////////////////////////// //定义结构体 数据结构核心 struct node { int id; //char name[20]; struct node* next; }; //p_head头指针,永远指向第一个节点 struct node* p_head = NULL; //p_node可以指向任意一个节点 struct node* p_node; //new_node指针 struct node* new_node; //主函数//////////////////////////// int main(int argc, char* argv[]) { //创建一个链表 参数是头指针? //printf("%d ",CreateLinkList(p_head, 5)); CreateLinkList(p_head, 5); ShowLinkList(p_head); printf("length = %d", GetLength(p_head)); /////////////////////////////////////// //主函数结束 不要修改 getchar(); return 0; } int CreateLinkList(struct node* p_head, int n) { int i; //新建第一个节点 new_node = (struct node*)malloc(sizeof(struct node)); new_node -> next = NULL; new_node -> id = 0; //strcpy(new_node -> name, "a"); //p_head和p_node都是指向第一个节点 p_head = new_node; p_node = new_node; for(i = 0;i < n - 1;i++) { new_node = (struct node*)malloc(sizeof(struct node)); new_node -> next = NULL; new_node -> id = i + 1; //p_node后移 指针变换 p_node -> next = new_node; //p_node = p_node -> next; p_node = new_node; } //成功标志? //printf("1"); return 1; } int GetLength(struct node* p_head) { int length = 0; for(p_node = p_head;p_node != NULL;p_node = p_node -> next) { length++; } return length; } void ShowLinkList(struct node* p_head) { for(p_node = p_head;p_node != NULL;p_node = p_node -> next) { printf("%d ", p_node -> id); } } int InsertNode(struct node* p_head, int location, int id) { int n = 1; if(location < 0 || location > GetLength(p_head)) { printf("错误,插入位置错误"); //错误处理 暂时省略 } if(location = 0) { new_node = (struct node*)malloc(sizeof(struct node)); new_node -> id = id; new_node -> next = p_head; p_head = new_node; } else { for(p_node = p_head;n < location;p_node = p_node -> next) { n++; } new_node = (struct node*)malloc(sizeof(struct node)); new_node -> id = id; new_node -> next = p_node -> next; p_node -> next = new_node; } return 1; }
这个才是正确的
#include <stdio.h> #include <stdlib.h> struct Node{ int data; struct Node *next; }; void InitList(struct Node **pHead); struct Node* CreatNode(int d); struct Node* FindKth(struct Node* head, int k); int Insert(struct Node** pHead, int index, int element); void PrintList(struct Node* head); void DestroyList(struct Node** pHead); int DeleteNode(struct Node** pHead, int index); int main(){ struct Node *head; InitList(&head); Insert(&head, 1, 6); Insert(&head, 1, 61); Insert(&head, 1, 62); Insert(&head, 1, 63); Insert(&head, 1, 64); PrintList(head); printf("%d ",DeleteNode(&head, 6)); PrintList(head); DestroyList(&head); return 0; } int DeleteNode(struct Node** pHead, int index){ struct Node* pTmp, *pNodeToBeDeleted; if (*pHead == NULL) { return -1; } if (index == 1) { pTmp = *pHead; *pHead = (*pHead)->next; free(pTmp); return 0; } pTmp = FindKth(*pHead, index-1); if (!pTmp) { // if(pTmp == NULL) return -2; } if (pTmp->next == NULL) { return -3; } pNodeToBeDeleted = pTmp->next; pTmp->next = pNodeToBeDeleted->next; free(pNodeToBeDeleted); return 0; } void DestroyList(struct Node** pHead){ struct Node* pTmp; while (*pHead) { pTmp = *pHead; *pHead = (*pHead)->next; free(pTmp); } } void PrintList(struct Node* head){ struct Node* pTmp; pTmp = head; while (pTmp) { printf("%d ",pTmp->data); pTmp = pTmp->next; } printf(" "); } int Insert(struct Node** pHead, int index, int element){ struct Node* pTmp, *pTmpNode; if (index == 1) { pTmpNode = CreatNode(element); pTmpNode->next = *pHead; *pHead = pTmpNode; return 0; } else{ pTmp = FindKth(*pHead, index-1); if (pTmp) { pTmpNode = CreatNode(element); pTmpNode->next = pTmp->next; pTmp->next = pTmpNode; return 0; } else return -1; } } struct Node* FindKth(struct Node* head, int k){ struct Node* pTmp; pTmp = head; int i=1; while (pTmp && i<k) { pTmp = pTmp->next; i++; } return pTmp; } void InitList(struct Node **pHead){ *pHead = NULL; } struct Node* CreatNode(int d){ struct Node* pTmp; pTmp = (struct Node*)malloc(sizeof(struct Node)); pTmp->data = d; pTmp->next = NULL; return pTmp; }