线性表是最基础的线性结构
顺序表是用一组地址连续的存储单元依次存储线性表中的各元素,通过位置来表示数据元素之间的线性逻辑关系。
链表是用一组任意的存储单元存储线性表中各个元素,通过指针来表示数据元素之间的线性逻辑关系。
一.链表的建立:
1.尾插法建立单链表
2.头插法建立
二.链表的插入
1,后插算法,时间复杂度为O(1)
2,前插算法,时间复杂度为O(n)
3, 按值插入,查找值为x的数值,前插或后插;
三,删除算法
1,按位置删除
2,按值删除
定义链表
typedef int DataType;
struct Node {
DataType data;
struct Node* next;
};
typedef struct Node *PNode;
typedef struct Node *LinkList;
LinkList SetNullList_Link()
{
LinkList head = (LinkList)malloc(sizeof(struct Node));
if (head != NULL) head->next = NULL;
else printf("alloc failure");
return head;
}
int IsNull_Link(LinkList llist)
{
return(llist->next == NULL);
}
//尾插法建立单链表
void CreateList(struct Node* head)
{
PNode p = NULL;
PNode q = head; int data;
scanf("%d", &data);
while (data != -1)
{
p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
p->next = NULL;
q->next = p;
q = p;
scanf("%d", &data);
}
}
2.头插法建立单链表
void CreateList(struct Node* head)
{
PNode p = NULL;
int data;
scanf("%d",&data);
while(data!=-1)
{
p = (struct Node*)malloc(sizeof(struct Node));
p->data = data;
p->next=head->next;
head->next=p;
scanf("%d",&data);
}
}
2.链表的删除
void DelNode_Link(LinkList head, int deldata)
{
PNode p=head->next,q=NULL;
int i=0;
while(p!=NULL)
{
if(p->data==deldata)
{
i=1;
break;
}
p=p->next;
}
if(i)
{
q=head;
while(q->next!=p)
q=q->next;
q->next=p->next;
free(p);
}
else
printf("no exit %d\n",deldata);
}
3.链表的插入
后插算法
int insert_link(Linklist llist,Pnode p,int x)
{
Pnode q;
q=(struct Node*)malloc(sizeof(struct Node));
q->data=x;
q->next=p->next;
p->next=q;
}
前插算法
int insert_link(Linklist llist,Pnode p,int x)
{
Pnode pre=llist;
Pnode q=NULL;
while(pre->next!=p)
pre=pre->next;
q=(struct Node*)malloc(sizeof(struct Node));
q->data=x;
q->next=p;
pre->next=q;
}
int InsertPost_link(LinkList llist, DataType x, DataType y)
{
int i=0;
PNode q;
PNode p=llist;
while(p)
{
if(p->data==x)
i=1;
p=p->next;
}
p=llist;
if(i)
{
while(p->data!=x)
p=p->next;
if(p==NULL)
{
printf("para meter failure!\n");
return 0;
}
q=(PNode)malloc(sizeof(struct Node));
if(q==NULL)
{
printf("Alloc failure!\n");
return 0;
}
else
{
q->data=y;
q->next=p->next;
p->next=q;
return 1;
}
}
else
printf("not exist data %d\n",x);
}