链表:单向链表的理解,创建及基本操作
程序员文章站
2022-05-12 09:21:26
...
链表的创建
typedef struct info{
int data;
struct info *next;
}node;
int main(){
node *head=NULL;
}//这是一个空链表,head是它的开头,然而现在什么都没有
我们得到这样的数据类型:该类型包含数据(data)和指针next两部分,指针指向下一个相同的结构体.
链表的基本操作
-
增
现在我们需要新增这样的结构体并链接它们,为了更方便地对链表进行操作,我们再引入这样一个结构体;
typedef struct ctrl{
node *head;//指向链表头部
node *tail;//指向链表尾部 方便后续操作
}List;
void add(List *list,int num){//尾插
node *p=(node *)malloc(sizeof(node));
p->next=NULL;
p->data=num;
if(list->next){
list->tail=p;
}else{
list->head=list->tail-p;
}
}
void head_add(List *plist,int num){//头插
node *p=(node *)malloc(sizeof(node));
p->num=num;
if(plist->head){//链表不为空
p->next=plist->head;
plist->head=p;
}else{//链表为空
plist->head=p;
p->next=NULL;
}
}
int main(){
int num;
List list;
list.head=list.tail=NULL;
while(scanf("%d",&num)&&num!=-1){//假设-1为输入结束标志
add(&list,num);
}
}
-
查
查 可以作为遍历的改体
//遍历输出
void print(List *list){
node *p;
for(p=list->head;p;p=p->next){
pritnf("想输出啥输出啥");
}
}
//基本查找
void search(List *list,int obj){
node *p;
for(p=list->head;p;p=p->next){
if(p->data==num){
printf("//for example,print num'name if it has")
}
}
}
- 改
//可参照查
node * change(List *list,int num){
node *p;
for(p=list->head;p;p=p->next){
if(p->data==num){
return p;
}
}
}
//我们返回这样一个指向目标的指针,可以对其任意部分进行修改
其实我们也可以写一个void的函数,传入更多参数,进行数据域中不同数据的修改。
- 删
void kill(List *list,int num//按某数据查找目标){
node *p=list->head,*dead;
if(p->data==num){//需要删除的是第一个
list->head=p->next;
free(p);
}else{
for(p;p->next;p=p->next){
if(p->next->data==num){//找到我们需要删除的
dead=p->next;
p->next=dead->next;
free(dead);//加上break;删除一个即停止
}
}
}
}
第一个节点不放东西的写法
如果第一个节点不放数据,则插入时无需判断链表是否为空,插入时更为简洁。
void head_add(List *list,int num){
node *p=(node *)malloc(sizeof(node));
p->data=num;
p->next=list->head->next;
list->head->next=p;
}//头插时tail失去作用
void add(List *list,int num){
node *p=(node *)malloc(sizeof(node));
p->data=num;
p->next=list->tail->next;//p->next=NULL;
list->tail->next=p;
list->tail=p;
}
int main(){
List list;
int num;
node *p=(node *)malloc(sizeof(node));//空的头结点
p->next=NULL;
list.head=list.tail=p;
while(scanf("%d",&num)&&num!=-1){
add(&list,num);
}
}
注意此时遍历链表时从list->head->next开始
//如有错误或更好的方法,还请指出
2018/4/21
上一篇: 简单就是易于调试 | Linux 中国