数据结构之线性表篇
一.线性表的链式存储
1. 结点的描述
typedef struct node{
int data;
struct node *next;
}NODE,*Linklist;//等价于 define NODE *Linklist;
2.单链表的创建
LinkList createList(){
LinkList head;//生成头结点
head = (LinkList)malloc(sizeof(NODE));
LinkList tail = head;
tail->next = NULL;
printf("请输入链表长度");
int num;
scanf("%d",&num);
printf("请依次输入%d个元素\n",num);
for(int i=num;i>0;i--){
LinkList p = (LinkList)malloc(sizeof(NODE));
scanf("%d",&p->data);
//尾插法
tail->next=p;
tail=p;
tail->next = NULL;
/*
头插法
p->next = tail->next;
tail->next=p;
*/
}
printf("初始化成功\n");
return head;
}
3.遍历单链表
void PrintList(LinkList head){
LinkList p;
p = head->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
4.求链表长度
int lengthList(LinkList head){
int len;
LinkList p = head->next;
while(p!=NULL){
len++;
p=p->next;
}
}
5.查找元素(按序号)
LinkList getNodeByNum(LinkList head,int loc){
if(loc<1||loc>lengthList(head)){
printf("该元素不存在");
return NULL;
}
LinkList p = head;
int i;
while(p->next&&i<j){
p=p->next;
i++;
}
if(i==j)
return p;
else
return NULL;
}
6.查找元素(按值)
LinkList getNodeByVal(Linklist head,int value){
LinkList p = head;
while(p->next&&p->data!=value)
p=p->next;
if(p->data==value)
return p;
else
return NULL;
}
7.插入
int insertList(Linklist head,int loc,int value){
LinkList p,r;
if(loc==1)
p=head;
else{
p=getNodeByNum(head,loc-1);
}
if(p==NULL)
return 0;
r=(LinkList)malloc(sizeof(NODE));
r->data = value;
r->next = p->next;
p->next = r;
return 1;
}
8.删除
int deleteList(LinkList head,int loc){
LinkList p,r;
if(loc==1)
p=head;
else
p=getNodeByNum(head,loc-1);
if(p==NULL||p->next==NULL)//p不存在或p为最后一个结点
return 0;
r=p->next;
p->next = r->next;
free(r);
return 1;
}
9.逆置单链表
- 反转指针
LinkList reverseList(LinkList head){
LinkList pre,p=head->next,r=p->next;
//对第一个结点操作
p->next=NULL;
while(r)//当r为NULL时,则p为最后一个结点
{
pre=p;
p=r;
r=r->next;
p->next=pre;
}
head->next = p;
return head;
}
- 头插法
LinkList reverseList(LinkList head){
LinkList p,r;
p=head->next;
head->next=NULL;//先将头结点分离出去 然后使用头插法
while(p){
r=p->next;
p->next=head->next;
head->next=p;
p=r;
}
return head;
}