您的位置:首页 > 理论基础 > 数据结构算法

07013《数据结构与算法》 第2章 线性表——链表

2020-06-08 05:21 267 查看

创建一个链表

单链表:

typedef struct node{char data; 			//数据在这里
struct node *next;	//指向下一个结点的指针
}NODE;				//这个结构体的大名
NODE *head;			//头结点

双链表:

typedef struct dnode{char data;
struct node *leftLink;
struct node *rightLink;
}DNODE;

链表的初始化

无表头:

NODE head=NULL;	//建立一个空表

有表头:

NODE*head;
head=(NODE*)malloc(sizeof(NODE));
head->next=NULL;

链表的插入

思路:找到a结点其后插入b结点,如无a结点直接将b结点插在表尾;

NODE *LListInsert(NODE*head,char a,char b)
{
NODE*p,*q;
q=(NODE*)malloc(sizeof(NODE));
q->data=b;
q->next=NULL;
if(head==NULL)
return q;
else {
p=head;
while(p->data!=a&&p->next!=NULL)
p=p->next;
q->next=p->next;	//这里一定要注意顺序
p->next=q;			//一定要先搞定后面的再搞前面的!!!
return(head);		//否则就无限循环了!!扑街啊!!
}
}

双向链表有表头:

void DLListInsert(DNODE *head,char a,char b)
{
DNODE *p,*q;
q = (*DNODE)malloc(sizeof(DNODE));
q->data = b;
p = head->rightLink;
while (p!=head)
if (p->data!=a)
p=p->rightLink;
else break;
if (p==head)
p=p.leftLink;
q.leftLink=p;
q.rightLink=p.rightLink;
p.rightLink->leftLink=q;
p.rightLink=q;
}

链表的删除

无表头:

int LListDelete(NODE**p_head,char a)
{
NODE*p,*q;
q=*p_head;
if(q==NULL)
return 0;
if(q->data==a) {
*p_head=q->next;
free(q);
return 1;
}
else {
while(q->data!=a&&q->next!=NULL) {
p=q;
q=q->next;
}
if(q->data==a) {
p->next=q->next;
free(q);
return 1;
}
else return 0;
}
}

有表头:

int LListDelete1(NODE*head,char a)
{
NODE*p,*q;
q=head;
p=q->head;
while(p!=NULL) {
if(p->data==a) break;
else {
q=p;
p=p->next;
}
}
if (p!=NULL) {
q->next=p->next;
free p;
return 1;
}
else return 0;
}

双向链表有表头:

int DLListDelete(DNode*head,char x)
{
DNODE *p;
p=head->rightLink;
while (p!=head)
if (p->data!=x)
p=p->rightLink;
else
break;
if (p==head)
return 0;
p->leftLink->rightLink=p->rightLink;
p->rightLink->liftLink=p-liftLink;
free(p);
return 1;
}

链表的查找算法

无表头:

NODE*LListSearch(NODE*head,char x)
{
NODE*p;
p=head;
while(p!=NULL)
if(p->data!=x)
p=p->next
else break;
return p;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐