数据结构(C语言版)链表相关操作算法的代码实现
这次实现的是带头结点的单链表的初始化、遍历、创建、插入、删除、判断链表是否为空、求链表长度函数,编译环境是vs2013。
其中插入和删除函数中循环的条件目前还不太明白。
#include<iostream> using namespace std; typedef int Status; typedef char Elemtype; //定义链表的存储结构,注意这里与算法的定义有一处不同,是定义结构体时就命名Lnode,说明*next的类型只要说是Lnode类型就可以 typedef struct Lnode{ Elemtype data; Lnode *next; }Lnode, *LinkList; //各函数声明部分 Status InitLinkList(LinkList &L);//初始化 Status CreateList(LinkList &L, int length);//创建链表 Status TraverseList(LinkList L);//遍历 Status GetLength(LinkList L);//求长度 Status IsEmpty(LinkList L);//判断是否为空 Status InsertList(LinkList &L, int target, Elemtype e);//第target个元素前插入元素 Status DeleteList(LinkList &L, int target, Elemtype &e);//删除第target元素 void main(){ LinkList link=NULL; int n=5; InitLinkList(link); CreateList(link, n); //printf("%d",GetLength(link)); //char *s = IsEmpty(link)?"链表为空!":"链表不为空!"; //printf("判断结果:%s\n", s); //InsertList(link, 2, '3'); Elemtype e; DeleteList(link,5,e); printf("删除的元素是:%c\n", e); TraverseList(link); getchar(); } //链表初始化函数:创建头指针,指针域赋空值 Status InitLinkList(LinkList &L){ L = (LinkList)malloc(sizeof(Lnode)); if (!L){ return false; } L->next = NULL; return true; } //创建链表函数: Status CreateList(LinkList &L, int length){ LinkList p=NULL, q=NULL; q = L; q->next; for(int i = 0; i <length; i++){ p = (LinkList)malloc(sizeof(Lnode)); if (!p){ return false; } printf("输入存入链表的字符:\n"); scanf_s("%c", &p->data); //2016.4.11报错原因:微软改写了c的函数,加入了参数检测 //方法:将scanf()函数改为scanf_s()函数 getchar(); //2016.4.12循环只读入了第一次,原因是vs不读入回车,输入的回车会作为下次循环的输入,看起来像没读入 //解决方法:在scanf后写getchar函数,接收回车 q->next = p; p->next = NULL; q = p; } printf("链表创建成功!\n"); return true; } //链表遍历函数 Status TraverseList(LinkList L){ LinkList p = NULL; p = L->next; //2016.4.12遍历时第一个元素为空,丢掉了最后一个元素,因为头结点不含有效值 //所以要将遍历的起点设在第一元素结点处:L->next if (!p){ return false; } while (p)//注意这里的判断条件是p,不是p->next { printf("链表中的元素:"); printf("%c", p->data); printf("\n"); p = p->next; } return true; } int GetLength(LinkList L){ LinkList p=L->next;//注意这里的起点仍为首元结点,因此返回的链表长度是除去头结点的 int count=0; while (p){ count++; p = p->next; } return count; } //判断链表是否为空 Status IsEmpty(LinkList L){ if (L->next == NULL){ return true; } return false; } //在第target个元素前插入一个元素 Status InsertList(LinkList &L, int target, Elemtype e){ LinkList p=L;//这里起点是头结点,因为可能插在第一个元素之前 LinkList s = NULL; int i = 0; while (p&&i < target-1){ //不太懂这里的条件 p = p->next; ++i; } if (!p||target>i-1){//判断非法位置 return false; } s = (LinkList)malloc(sizeof(Lnode)); s->data = e; s->next = p->next; p->next = s; return true; } //删除第target个元素 Status DeleteList(LinkList &L, int target, Elemtype &e){ int i=0; LinkList p = L; LinkList q = NULL; while (p->next&&i < target - 1){ p = p->next; i++; } if (!(p->next) || i>target - 1){ return false; } q = p->next; p->next = q->next; e = q->data; free(q); }