首页 > 代码库 > 数据结构C语言实现——线性链表
数据结构C语言实现——线性链表
declaration.h
#ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; typedef struct LNode { ElemType data; struct LNode *next; }LNode, *LinkList; #endif // DECLARATION_H_INCLUDEDfunction.h
#ifndef FUNCTION_H_INCLUDED #define FUNCTION_H_INCLUDED void CreateList_L(LinkList *L, int n); //逆序输入n个元素的值,简历带头结点的单链表L Status ListInsert_L(LinkList *L , int i, ElemType e); //在带头结点的单链线性表中第i个位置前插入元素e Status ListDelete_L(LinkList *L, int i, ElemType e); //在带头结点的单链线性表中,删除第i个元素并由e返回其值 Status GetElem_L(LinkList L, int i, ElemType *e); //L为带头结点的单链表的头指针 //当第i个元素存在时将其值付给e并返回OK,否则返回ERROR Status MergeList_L(LinkList *La, LinkList *Lb, LinkList *Lc); //归并La和Lb表到Lc并按非递减序列排列 void PrintList_L(LinkList L); //输出单链表中的内容 #endif // FUNCTION_H_INCLUDEDfunction.c
#include <stdio.h> #include <stdlib.h> #include "declaration.h" void CreateList_L(LinkList *L, int n) { Status i; LinkList p; *L=(LinkList)malloc (sizeof(LNode)); (*L)->next=NULL; //先建立带头结点的单链表;->的优先级比*高不要漏掉这里的括号 for(i=n; i>0 ;i--) { p=(LinkList)malloc((sizeof(LNode)));//生成新节点 scanf("%d", &p->data); p->next=(*L)->next; //插入到表头 (* L)->next=p; // 数据是倒着插入连表的,即最后输入的数在表头 } }//CreateList_L Status ListInsert_L(LinkList *L , int i, ElemType e) { LinkList p=*L, s; ElemType j=0; while( p && j < i-1) { p=p->next; j++; } if(!p || j >i-1) return ERROR; //i小于1或大于表长加1 s=(LinkList)malloc(sizeof(LNode)); s->data=http://www.mamicode.com/e;>main.c#include <stdio.h> #include <stdlib.h> #include "declaration.h" #include "function.h" int main() { ElemType e; LinkList *La, *Lb, *Lc; La=(LinkList *)malloc(sizeof(LinkList)); Lb=(LinkList *)malloc(sizeof(LinkList)); Lc=(LinkList *)malloc(sizeof(LinkList)); printf("create la ,please enter 5 number:"); CreateList_L(La, 5); printf("la="); PrintList_L(*La); printf("la表中第3个数是%d\n", GetElem_L(*La, 3, &e)); printf("删除la表中的第一个数是%d\n", ListDelete_L(La, 1,&e)); printf("after delete first member ,la="); PrintList_L(*La); printf("create lb ,please enter 4 number:"); CreateList_L(Lb, 4); printf("lb="); PrintList_L(*Lb); ListInsert_L(Lb, 2, 3); printf("after insert 3, lb ="); PrintList_L(*Lb); printf("MergeList function ,Lc=\n"); if(MergeList_L(La, Lb, Lc) ==OK) { printf("merget success\n"); PrintList_L(*Lc); } else printf("merget failed"); return 0; }分别定义二级指针La,Lb,Lc,将它们作为参数传递到CreateList_L()函数中,这样我们就可以在局部的函数里面为*La, *Lb, *Lc分配存储空间,这些空间在结束函数调用时是不会消失的。C语言中参数传递都是值传递的方式:若以变量的值作为形参,传入的是一份值的拷贝。函数无返回类型时,对变量值得改变仅在该调用函数内有效;若以指针或数组名坐形参,传递的是变量的地址,同样的在调用函数内对这个地址的改变不会扩散到这个函数外,但对这个地址所代表的内存空间进行赋值,这种改变是永久的,结束调用时也不会被释放。
在实现MergeList_L(LinkList *La, LinkList *Lb, LinkList *Lc)时,一开始忘记为*Lc分配地址空间,使pc成为野指针,结果运行时程序一直挂掉浪费了好长一段时间。切记指针使用时一定要初始化。
运行结果:
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。