考研复习(2)链表操作
来源:互联网 发布:udid定制源码 编辑:程序博客网 时间:2024/06/05 03:56
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;
}
}
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;
}
}
- 考研复习(2)链表操作
- 考研复习(3)链表操作续
- 考研复习(4)-栈操作
- 考研复习(5)-队列操作
- 数据结构考研复习--线性表2
- 考研复习(1)-线性表
- 考研复习(一)
- 考研复习(7)树的基本操作
- 考研复习(8)-图的基本操作
- 考研复习第2弹
- 数据结构考研复习--线性表3(约瑟夫环)
- 考研数据结构复习之线性表(二)
- 复习链表操作
- 数据结构考研复习--线性表1
- 考研数据结构复习之线性表
- 考研复习(9)-图的应用
- 考研复习之栈(一)
- 链表基本操作复习
- 无向连通图的割点、桥
- 第一个OpenGL程序
- 策略模式的两种表示方法
- 数据库中CONVERT函数做成时间的全部用法
- KPT滤镜详解(六):Pyramid Paint
- 考研复习(2)链表操作
- KPT滤镜详解(七):Lighting
- 泛型的继承或实现
- 如何辨别优秀的程序员
- 遍历集合的三种方式
- POJ1751 PRIM基础题(模板)
- 遍历数组和集合可以用增强for语句来实现
- 自动装箱和自动拆箱
- win7下安装sqlserver 2008--previous reladses of microsoft visual studio 2008 解决