一、链表
1.线性表的链式存储目的:解决顺序存储的缺点,插入和删除,动态存储问题。
2.特点:
(1)线性表链式存储结构的特点是一组任意的存储单位存储线性表的数据元素,存储单元可以是连续的,也可以不连续。可以被存储在任意内存未被占用的位置上。
(2)也就是说前面的顺序表只需要存储数据元素信息就可以了。在链式结构中还需要一个元素存储下一个元素的地址。
3.结点
(1)为了表示每个数据元素,ai与其直接后继数据元素ai+1之间的逻辑关系,对ai来说,除了存储其本身的信息外,还需要存一个指示器直接后续的信息。把存储元素信息的域叫数据域,把存储直接后继位置的域叫指针域。这两部分信息组成数据元素ai的存储映像,叫结点(Node);
(2)链式结构
4.手撕基本函数
(1)linklist.h
#ifndef _LINKLIST_H_
#define _LINKLIST_H_
typedef struct
{
char name[10];
char sex;
int age;
int socre;
}DATATYPE;
typedef struct _node_
{
DATATYPE data;
struct _node_ *next;
}LinkNode;
typedef struct
{
LinkNode *head;
int clen;
}LinkList;
LinkList *CreatLinkList();
int InsertHeadLinkList(LinkList *ll,DATATYPE* data);
int IsEmptyLinklist(LinkList *ll);
int GetSizeLinkList(LinkList *ll);
int ShowLinkList(LinkList*ll);
DATATYPE * FinfLinkList(LinkList*ll,char *name);
int DeleteLinkList(LinkList *list, char *name);
int InsertTillLinkList(LinkList *ll,DATATYPE *data);
int IsertPosLindList(LinkList *ll,DATATYPE *data,int pos);
#endif
(2)创建
LinkList *CreatLinkList()
{
LinkList *ll = malloc(sizeof(LinkList));
if(NULL == ll)
{
fprintf(stderr, "CreatLinkLis malloc");
}
ll->head = NULL;
ll->clen =0;
return ll;
}
(3)头插
int InsertHeadLinkList(LinkList *ll,DATATYPE* data)
{
LinkNode *newnode = malloc(sizeof(LinkNode));
if(NULL == newnode)
{
fprintf(stderr, "InsertHeadLinkList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE));
newnode->next = NULL;
if(IsEmptyLinklist(ll))
{
ll->head=newnode;
}
else
{
newnode->next =ll->head;
ll->head =newnode;
}
ll->clen++;
return 0;
}
int IsEmptyLinklist(LinkList *ll)
{
return 0 == ll->clen;
}
int GetSizeLinkList(LinkList *ll)
{
return ll->clen;
}
(4)显示
int ShowLinkList(LinkList*ll)
{
int len = GetSizeLinkList(ll);
LinkNode *tmp = ll->head;
int i;
for(i = 0 ; i < len ; ++i)
{
printf("%s %c %d %d\n",tmp->data.name,tmp->data.sex,tmp->data.age,tmp->data.socre);
tmp = tmp->next;
}
return 0;
}
(5)查找
DATATYPE *FinfLinkList(LinkList*ll,char *name)
{
LinkNode *tmp = ll->head;
while(tmp)
{
if(strcmp(tmp->data.name,name))
{
return &tmp->data;
}
tmp = tmp->next;
}
return NULL;
}
(6)删除指定位置
int DeleteLinkList(LinkList *ll, char *name)
{
LinkNode *tmp =ll->head;
if(IsEmptyLinklist(ll))
{
return 1;
}
if(0 ==strcmp(ll->head->data.name,name))
{
ll->head = ll->head->next;
free(ll->head);
ll->clen--;
}
while(tmp->next)
{
if(0 ==strcmp(tmp->next->data.name,name))
{
LinkNode *tmp2 = tmp->next;
tmp->next =tmp->next->next;
free(tmp2);
ll->clen--;
return 0;
}
tmp = tmp->next;
}
return 1;
}
(7)尾插
int InsertTillLinkList(LinkList *ll,DATATYPE *data)
{
LinkNode *newnode = malloc(sizeof(LinkNode));
if(NULL == newnode)
{
fprintf(stderr, "InsertTillLinkList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE));
if(IsEmptyLinklist(ll))
{
InsertHeadLinkList(ll, data);
}
LinkNode *tmp = ll->head;
while(tmp->next)
{
tmp = tmp->next;
}
tmp->next=newnode;
newnode->next=NULL;
ll->clen++;
return 0;
}
(8)指定位置插
int IsertPosLindList(LinkList *ll,DATATYPE *data,int pos)
{
LinkNode *newnode = malloc(sizeof(LinkNode));
memcpy(&newnode->data, data, sizeof(DATATYPE));
if(NULL == newnode)
{
fprintf(stderr, "IsertPosLindList malloc");
return 1;
}
memcpy(&newnode->data, data, sizeof(DATATYPE));
if(IsEmptyLinklist(ll))
{
InsertHeadLinkList(ll,data);
}
LinkNode *tmp = ll->head;
int len = GetSizeLinkList(ll);
if(len == pos)
{
InsertTillLinkList(ll,data );
}
int i=0;
for(i=0;i<pos-1;++i)
{
tmp = tmp->next;
}
newnode->next = tmp->next;
tmp->next = newnode;
ll->clen++;
return 0;
}