学计算机不敲代码是不行的。。。动手敲一下单链表的程序
头文件 ↓
/*
* 单链表(带头结点)
* 功能:创建 初始化 销毁 增加 删除 修改 查询
*
*/
#ifndef _h_LK
#define _h_LK
/* 数据类型:字符型,长度可变,不存在第0个元素 */
typedef struct LNode{
int size;
char *p_str;
LNode *next;
} *LinkList, LNode;
/******************************************************
* 定义一个空链表,并返回头结点
******************************************************/
LNode * initLinklist();
/******************************************************
* 用字节流建立一个链表,并返回头结点
******************************************************/
LNode * NewLinklist(char **pp,int ppSize,int pSize[]);
/******************************************************
* 判断链表是否为空,空则返回真
******************************************************/
bool isEmpety(LinkList root);
/******************************************************
* 按位查询,返回该结点指针,0->根结点
* 该结点不存在时,返回空
******************************************************/
LNode * ListFindByNum(LinkList root, int i);
/******************************************************
* 按位插入元素,返回该元素指针【同前插】
* 该位置不存在时,返回空
******************************************************/
LNode * ListInsertByNum(LinkList root, int i, int eSize, char *e_p);
/******************************************************
* 返回链表长度【不包含头结点】
******************************************************/
int ListLength(LinkList root);
/******************************************************
* 销毁链表
******************************************************/
void DelLinkList(LinkList root);
/******************************************************
* 删除第i个元素,返回删除结果
******************************************************/
bool DelLNode(LinkList root,int i);
/******************************************************
* 打印链表
******************************************************/
void PrintLinkList(LinkList root);
#endif
实现代码 ↓
/*
* 单链表(带头结点)
* 功能:创建 初始化 销毁 增加 删除 修改 查询
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
#define Maxsize 100
/*
* 定义一个空链表,并返回头结点
*/
LNode * initLinklist(){
LinkList root = (LinkList) malloc(sizeof(LNode));
root->size = 0;
root->p_str = NULL;
root->next = NULL;
return root;
}
/******************************************************
* 用字节流建立一个链表,并返回头结点
******************************************************/
LNode * NewLinklist(char **pp,int ppSize,int pSize[]){
LNode *root = initLinklist();
LNode *pr = root;
for(int i=0;i<ppSize;i++){
pr->next = (LNode *) malloc(sizeof(LNode));
pr = pr->next;
pr->p_str = pp[i];
pr->size = pSize[i];
}
pr->next = NULL;
return root;
}
/* 判断链表是否为空,空则返回真 */
bool isEmpety(LinkList root){
return (root->next==NULL)?true:false;
}
/*
* 按位查询,返回该结点指针,0->根结点
* 该结点不存在时,返回空
*/
LNode * ListFindByNum(LinkList root, int i){
LNode *p = root;
int n=0;
while( n<i && p!=NULL ){
p = p->next;
n++;
}
return p;
}
/*
* 按位插入元素,返回该元素指针【同前插】
* 该位置不存在时,返回空
*/
LNode * ListInsertByNum(LinkList root, int i, int eSize, char *e_p){
LNode *p = ListFindByNum(root,i-1);//查找第i个结点的前驱结点
if(p==NULL)
return NULL;
LNode *newNode = (LNode *) malloc(sizeof(LNode));
newNode->p_str = e_p;
newNode->size = eSize;
newNode->next = p->next;
p->next = newNode;
return newNode;
}
/******************************************************
* 返回链表长度【不包含头结点】
******************************************************/
int ListLength(LinkList root){
LNode *p = root;
int res=0;
while((p->next) != NULL){
p = p->next;
res++;
}
return res;
}
/******************************************************
* 销毁链表
******************************************************/
void DelLinkList(LinkList root){
if(isEmpety(root)){
free(root);
}else{
LNode *a = root;
LNode *b = root->next;
while(b != NULL){
free(a);
a = b;
b = b->next;
}
}
}
/******************************************************
* 打印链表
******************************************************/
void PrintLinkList(LinkList root){
LNode *p = root;
int i=0;
while(p->next!=NULL){
p = p->next;
printf("%d %s\n",++i,p->p_str);
}
}
/******************************************************
* 删除第i个元素,返回删除结果
******************************************************/
bool DelLNode(LinkList root,int i){
LNode *p1 = ListFindByNum(root,i-1);
if(p1==NULL||p1->next==NULL){
return false;
}
LNode *p2 = p1->next;
p1->next = p2->next;
free(p2);
return true;
}
简单调试代码 ↓
/*
* 单链表(带头结点)
* 功能:测试代码
* 测试对象:LinkList
*/
#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
int main(void){
//构造并打印链表
int ppSize = 6;
int pSize[6] = {4,5,6,7,8,9};
char **pp = (char **) malloc( sizeof(char*) * ppSize );
pp[0] = (char*)"123";
pp[1] = (char*)"1234";
pp[2] = (char*)"12345";
pp[3] = (char*)"123456";
pp[4] = (char*)"1234567";
pp[5] = (char*)"12345678";
LNode *root = NewLinklist(pp, ppSize, pSize);
printf("\n创建链表:\n");
PrintLinkList(root);
//查询第i个结点
printf("\n查询第4个结点\n");
printf("%s\n",ListFindByNum(root, 4)->p_str);
//插入元素至头部
printf("\n插入元素至头部\n");
char *s = (char*)"test";
int sSize = sizeof(s);
ListInsertByNum(root, 1, sSize, s);
PrintLinkList(root);
printf("\n链表长度:%d\n",ListLength(root));
//插入元素至尾部
printf("\n插入元素至尾部\n");
ListInsertByNum(root, ListLength(root)+1, sSize, s);
PrintLinkList(root);
//删除第一个元素
printf("\n删除第一个元素\n");
DelLNode(root,1);
PrintLinkList(root);
//删除末尾元素
printf("\n删除末尾元素\n");
DelLNode(root,ListLength(root));
PrintLinkList(root);
//销毁链表
DelLinkList(root);
getchar();
return 0;
}