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

c语言_数据结构_单链表

2014-08-13 12:04 183 查看
将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,通过地址或指针建立它们之间的联系,所得到的存储结构为链表结构,表中ai的结点形式如图表示:



其中结点的data域存放数据元素ai,而next域是一个指针,指向ai的直接后继ai+1所在的结点。单链表结构如下:






单链表的建立:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <unistd.h>

typedef int datatype;

//声明结点,结点包括元素数据以及指针域。
typedef struct node
{
datatype data;
struct node *next;
}linknode,*linklist;

//初始化链表。1)分配内存;2)将头节点指针域指向空,该指向也是链表遍历的判断依据;3)返回头节点地址。
linklist init_list(void)
{
linklist head = (linklist)malloc(sizeof(linknode));
head->next = NULL;
return head;
}

//插入结点。1)新建结点,对于链表来说,不同于顺序表一次性将总表长的内存分配完毕,因此在每次新建
//结点都该给新结点newnode分配内存;2)将插入的数据赋予newnode的data域;3)定义中间结点p,p主要在
//遍历过程中起作用,初始化p等于head头结点进行遍历,当p->next指向NULL时,说明当前结点为末结点,
//否则继续遍历下一结点;4)在找到末结点后,将末结点p->next指针指向新结点newnode,新结
//点newnode->next指向NULL,此时完成新结点的插入,新结点newnode成为末结点。
bool insert_list(linklist head,datatype n)
{
linklist newnode = (linklist)malloc(sizeof(linknode));
newnode->data = n;
linklist p = head;
while(p->next !=NULL)
p = p->next;

newnode->next = p->next;
p->next = newnode;
return true;
}

//删除结点。对链表遍历,当找到对应元素结点q时,记录其直接前驱结点p,将前驱结点的next域p->next指向
//q的直接后继结点p->next->next,释放q内存,完成删除工作。
bool remove_list(linklist head,datatype n)
{
linklist p = head;
linklist q;

while(p->next != NULL)
{
if(p->next->data == n)
{
q = p->next;
p->next = p->next->next;
free(q);
return true;
}
p = p->next;
}
printf("remove failed\n");
return false;
}

//打印结点。
void show_list(linklist head)
{
linklist p = head;
while(p->next != NULL)
{
p = p->next;
printf("%d\t",p->data);
}
printf("\n");
}

//链表逆转。依次将结点a0,a1,a2,……,an-1移到头结点作为其直接后继结点。如图:




void revert_list(linklist head)
{
linklist p = head->next;
linklist q;

head->next = NULL;

while(p != NULL)
{
q = p->next;
p->next = head->next;
head->next = p;
p = q;
}
}

//测试。输入正数则插入结点,负数则删除对应结点,最后逆转链表。
int main(void)
{
datatype n;
linklist l = init_list();
while((scanf("%d",&n)) == 1)
{
if(n > 0)
{
if((insert_list(l,n)))
show_list(l);
else
printf("insert failed\n");
}
else
{
if((remove_list(l,-n)))
show_list(l);
else
printf("remove failed\n");
}
}
revert_list(l);
printf("revert linklist:\n");
show_list(l);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: