链表的特点:
由一组存储单元地址任意的数据元素按照一定的线性逻辑关系排列组成(呆呆自己的理解),用一组任意的存储单元(存储单元可以连续 也可以不连续)存储线性表的数据元素(教材定义)。每个数据元素包含两部分组成:数据域和链域(指针域)。
常见的链表:线性链表、静态链表、循环链表和双向链表
线性链表——有类似于铰链,一个接一个,有首尾,一个结点含有一个元素数据(data)和下一个数据元素的指针
静态链表——用结构体数组模拟链表
循环链表——表中最后一个结点的指针指向头结点
双向链表——一个结点含有一个元素数据和两个指针(一个指向当前结点的前驱,另一个指向当前结点的后继)
常用的链表操作:插入和删除(这里不一一列出链表的操作函数)
以下代码是小呆呆自己手写的一部分,仅供参考
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct LNode//define a linked list element node
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void deletelist(LinkList L,int a,int b)
{
int i;
LinkList p,q;
p=L;
if(b>a||b<1)exit(ERROR);
for(i=1;i<=b-1;i++)
p=p->next;
q=p->next;
p->next=p->next->next;//删除第b个元素
free(q);
}
void insertlist(LinkList L,int a,ElemType b)
{
int i;
LinkList p,q;
for(i=1,p=L;i<=a-1;i++)p=p->next;
q=(LinkList)malloc(sizeof(LNode));
q->next=p->next;
q->data=b;
p->next=q;
}
void Createlist(LinkList L,int a)
{
LinkList p,q;
q=L;
int i;
for(i=0;i<a;i++)
{
p=(LinkList)malloc(sizeof(LNode));
scanf("%i",&p->data);
q->next=p;
p->next = NULL;
q = p;
}
}
int main()//单链表的实现
{
int a,b;
ElemType c;
LNode l;
LinkList L,p;
void deletelist(LinkList L,int a,int b);
void insertlist(LinkList L,int b,ElemType c);
void Createlist(LinkList L,int a);
L=&l;
L->data=1;
L->next=NULL;
printf("%i\n",L->data);
printf("\nplease input the length of the linked list \n");
scanf("%i",&a);
Createlist(L,a);
for(p=L;p!=NULL;p=p->next)printf("%i\t",p->data);
printf("\nplease input the location of the element to be deleted\n");
scanf("%i",&b);
deletelist(L,a,b);//删除第b个元素,a为链表数据元素个数
for(p=L;p!=NULL;p=p->next)printf("%i\t",p->data);printf("\n");
printf("please input the location of the element to be inserted and its value\n");
scanf("%i%i",&b,&c);//注意格式控制语句,此处为易错点
insertlist(L,b,c);
for(p=L;p!=NULL;p=p->next)printf("%i\t",p->data);printf("\n");
// system("pause");
return 0;
}
还请各位大佬提出宝贵的意见
2019年2月28日午后