数据结构-----链表

一、链表
概念:线性表的链式存储结构,我们叫做链表----单向链表
带头结点的单向链表
[1]头结点:数据域默认不使用,指针域保存第一个有效数据结点的地址。
[2]尾结点:指针域默认为NULL,作为链表结束的标志。

二、数据类型的设计
typdef int DataType; //数据域存储数据的类型

typedef struct node {
DataType data;  //存储的数据
struct node *next; //保存下一个结点的首地址
}LinkNode;

三、常用操作步骤
<1>为头结点在堆区分配空间,head->next = NULL;
LinkNode *create_empty_linklist()
{
LinkNode * head = NULL;
head = (LinkNode *)malloc(sizeof(LinkNode));
if(NULL == head)
{
printf("malloc is fail!\n");
return NULL;
}
head->next = NULL;

return head;
}

<2>头插法,每次在头结点后插入数据
int insert_head_linklist(LinkNode *head,DataType data)
{
//1.为新节点在堆区分配空间,用指针temp来保存
//2.把data数据填充到temp的数据域

//3.在头结点之后插入数据
//<1>先让新节点的指针域保存头结点的指针域
//<2>再让头节点的指针与保存新节点的首地址


return 0;
}

<3>输出链表中所有的数据
int print_linklist(LinkNode *head)
{
//遍历所有节点,当指针域不为空的时候,
//每遍历一个节点,就输出一个数据。
}


<5>尾插法,每次在尾结点后插入数据
void insert_tail_linklist(LinkNode *head,DataType data)
{
//思路:1.每次找到尾结点  
//      2.为新节点分配内存,填充数据
//      3.把新结点和尾结点连接在一起。
}

<6>有序插入,按照一定的顺序在链表中插入我们的数据(从小到大)
void insert_order_linklist(LinkNode *head,DataType data)
{
//1.为新结点分配空间,用temp保存首地址
//2.将插入数据存放数据新结点数据域
 
 //3.循环找到插入位置前一个节点,p。
 //注:p指向当前节点,单我们比较是后一个节点的数据p->next-data
 
 
 //4.在p节点的后面插入数据。
 //  <1>先让新节点的指针域保存p节点的指针域
 // <2>p的指针域名保存新结点的首地址。
}

<7>//删除相同数据的结点。
int delete_samedata_node(LinkNode *head,DataType data)
{
//1.定义两个两个指针,p = head,q = head->next。

//2.让q循环遍历链表,当q != NULL的时候,判断
// q->data 是否与10相等,若是相等的话,则让
// p的指针域保存q的下一个结点的地址,然后释放
// q,并且更新q的值为p->next。 否则,若是不相等
// 的话则让p = p->next ,q = q ->next
}
//9.大家来实现链表的逆置。
//例如:1 2 3 4 5,要求大家变成5 4 3 2 1
//思路: 从第二个有效数据开始,依次把数据向后头结点后
// 插入,插入完毕之后,第一个有效数据的结点就是
// 我们最后的一个结点。
int reverse_linklist(LinkNode *head)
{
//思路:1、判断链表是否是空链表,若是空链表则返回-1
// 2、定义指针变量p,保存第二个有效数据结点的地址。
// 3、并把第一个有效数据结点的指针域置为NULL

// 4、从p开始遍历链表,用q保存p后面一个结点,并插入到头结点后
}


//8.删除链表中所有的数据
int cleanup_linklist(LinkNode *head)
{
linknode *q = NULL;
linknode *p = head->next;
 
//遍历链表,每找到一个结点,用q保存该节点的地址。然后释放掉它
 
//最后在释放头结点的地址。

}


int main()
{
LinkNode *head = NULL;
int i = 0;
head = create_empty_linklist();
int a[] = {80,20,60,20,30,40,20};

for(i = 0;i < sizeof(a)/sizeof(a[0]);i++)
{
// insert_head_linklist(head,i + 1);
// insert_tail_linklist(head,i + 1);
insert_order_linklist(head,a[i])
}

print_linklist(head);

delete_samedata_node(head,20);

print_linklist(head);

reverse_linklist(head);

print_linklist(head);

cleanup_linklist(head);

return 0;
}
发布了20 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/pan337520/article/details/53353761