`
- 浏览:
1005375 次
- 性别:
- 来自:
北京
-
1.链表最好采用带头节点的逻辑结构,在删除等操作上比较方便,头节点便是0号节点;
2.在主函数之后定义的函数须在主函数之前申明;
3.要改变链表结构,续传递指向头节点指针的指针;
4.不能直接搬数据结构上的伪代码(严玮文版),还是要自己思考,最好能够画图;
5.调试时出现死循环的话,在终端键入:ps aux
查看死循环进程的pid,然后键入: kill -9 进程的pid 就能终止进程了.
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}Lnode,*LinkList;
int ListInsert(LinkList *L, int i,ElemType e);//插入元素
int ListDel(LinkList *L, int i);//删除元素
ElemType GetElem(LinkList L,int i);//获得第i个节点
void del(LinkList *L,int mink,int maxk);//删除区间节点
void inverse(LinkList *L);//逆置链表
int main()
{
LinkList Q;
initLink(&Q);
ListInsert(&Q,1,'f');
ListInsert(&Q,1,'e');
ListInsert(&Q,1,'d');
ListInsert(&Q,1,'c');
ListInsert(&Q,1,'a');
display(Q);
del(&Q,98,100);
display(Q);
inverse(&Q);
printf("After invert\n");
display(Q);
ListDel(&Q,1);
display(Q);
printf("The No.2 Element is:%c",GetElem(Q,2));
return 1;
}
void initLink(LinkList *L)//Only transport the address can change the Link
{
*L=(LinkList)malloc(sizeof(Lnode));
(*L)->next=NULL;
}
ElemType GetElem(LinkList L,int i)
{
Lnode *p=L->next;
int j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i) return 0;
return p->data;
}
void display(LinkList L)
{
Lnode *p=L->next;
if(p==NULL) printf("No element~\n");
else
{
while(p)
{
printf("%5c->",p->data);
p=p->next;
}
}
printf("\n");
}
int ListInsert(LinkList *L, int i,ElemType e)
{
Lnode *p=*L;//p point to the first node
int j=0;
Lnode *s;
while(p&&j<i-1)//search the No.(i-1) node
{
p=p->next;
j++;
}
if(!p||j>i-1) return 0; //i<1 or >ListLenth+1
s=(LinkList)malloc(sizeof(Lnode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
int ListDel(LinkList *L, int i)
{
Lnode *p=*L;
Lnode *pre=p;
int j=0;
while(p&&j<i)//search the No.i node
{
printf("ALALLA");
pre=p;
p=p->next;
j++;
}
if(!p||j>i) return 0; //i<1 or >ListLenth+1
pre->next=p->next;
}
//delete the element in the sorted linklist that value between mink and maxk
void del(LinkList *L,int mink,int maxk)
{
Lnode *p=*L;
Lnode *pre;
Lnode *q,*s;
while(p&&p->data<mink)
{
pre=p;p=p->next;
printf("address of p:%d",p);
}
if(p)
{while(p&&p->data<maxk) p=p->next;}
pre->next=p;
/*free the memory
q=pre->next;
while(q!=p)
{
s=q->next;free(q);q=s;
}*/
}
//avert a linklist
void inverse(LinkList *L)
{
Lnode *p=*L;
Lnode *s;
p=p->next;//move a element
(*L)->next=NULL;
while(p)
{
//insert at front
s=p->next;
p->next=(*L)->next;
(*L)->next=p;
p=s;
}
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
链表类 实现对不同数据的链表操作 数据可以是数 还可以是对象 结构体等等 排序插入可以继承类后加个重载比较运算符进行操作
链表操作程序(完整)C语言.txt链表操作程序(完整)C语言.txt
C语言链表的应用,包括建立链表、删除链表、插入/删除元素操作
链表很多同学不太理解,对此写了下链表的基本操作,头插法,对应位置修改删除等基本功能,仅提供自己学习。
复习一下大二的数据结构,为leetcode做准备。
数据结构 作业 链表的操作 完美链表 包括链表的 构造 数值的插入 删除 几种排序。。。。
数据结构——循环链表的操作1 数据结构——循环链表的操作1 数据结构——循环链表的操作1 数据结构——循环链表的操作1
双链表的常用操作 包括双链表的建立 双链表的打印 双链表的插入 双链表的删除节点
单向链表所有操作的c语言实现,代码经过在Linux下测试。在Windows下应该也没问题
写更多的代码,用更多的指针, 用更多的指针,写更多的代码, C语言编程,我还是要用链表。
用模板实现链表的建立删除等操作,可以根据具体情况稍作修改即可实现链表操作,或直接使用,我在链表的学习和类模板的学习和以后的编程时这种链表构造思想觉得挺好的,有点面向对象的意思……粗浅的理解呵呵!
使用的Java语言和JavaFX库编写的链表操作演示程序源码,对于链表的几个基本操作都具有演示动画,且数据可数据产生,也可以随机产生
数据结构线性链表操作 链表结点的增添 删除
用C++实现双向链表的插入,删除,更新等操作。
封装了链表的操作,功能有链表的创建,节点的添加(附加),插入(前插、后插和插入到链表头部),删除,得到节点数据,得到节点位置,得到节点总数,释放链表。 使用了类模版,使得可以让节点中的数据为任意类型,...
双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...
链表的操作,链表的加入、删除、合并操作
c 语言 链表基本操作,创建 查找 删除 插入 双向链表源码
集合了对C#单向链表的实现。让大家熟悉对C#操作
链表操作的动态演示.是Timer事件的一个极好的应用。