试着自己实现了双向链表,因为之前学的不明白;
实现后对指针的使用有了较好的理解;
另外,指针的删除功能就没写了,因为大致思想都是一样的,
即修改指针指向;
遗留问题:什么是模板?
结构值传递;已解决; 结构只是一个类型,不是指针,如果使用结构指针,由于地址是相同的,达不到重复为不同节点赋值的效果,所以单纯不用指针直接传值,再具体修改值即可;
#include<stdio.h>
#include<stdlib.h>
typedef struct info{
int data; //本来想把节点结构的data换这个类型的,但是其值传递还有问题,待修改;
}info;
typedef struct node{
int data;
struct node *prev, *next;
}linklist;
linklist *first_node, *last_node, *tmp_node;//首,尾,即时指针;
linklist *list_Create(int n);
void display(linklist *plist);
//linklist *list_Del(linklist *
void *list_HeadInsert( linklist *head, int data);
void *list_TailInsert();
void *list_AtInsert(int data, linklist *first_node, int index);
int main(void)
{
linklist *head;
int data;
info *pinfo;
int n;
printf("输入链表初始化节点数:\n");
scanf("%d",&n);
tmp_node = first_node = last_node
= head = list_Create(n);
display(head); //print list
printf("输入插头节点数据:\n");
scanf("%d", &data);
list_HeadInsert(head, data);
display(head); //print list
list_TailInsert();
display(head); //print list
printf("输入插人链表的位置和数据:\n");
scanf("%d %d", &n, &data);
list_AtInsert(data, first_node, n);
display(head); //print list
// printf("输入删除的数据:\n");
// scanf("%d",&n);
// n = list_Del(n);
// printf("delete %d data\n",n);
return 0;
}
linklist *list_Create(int n)
{
linklist* p,*p1;
linklist *head = (linklist*)malloc(sizeof(linklist));
if(head == NULL) printf("create failed\n");
p = head;
p->prev = NULL;
int i=0, data;
while(n--)
{
p1 = (linklist*)malloc(sizeof(linklist));
printf("输入第%d个节点数据:", ++i);
scanf("%d", &data);
p1->data = data;
p->next = p1;
p1->prev = p;
p = p1;
}
last_node = p1;
p1->next = NULL;
return head;
}
void display(linklist *head)
{
linklist *p = head->next;
while(p->next)
{
printf("%d<->", p->data);
p = p->next;
}
printf("%d\n", p->data);
last_node = p;
}
//linklist *list_Del_index(linklist *plist, int index)//根据下标;
//{
//
//}
//linklist *list_del_data(linklist *plist, info *pinfo)//根据data;
//{
//
//}
void *list_HeadInsert(linklist *head, int data)//也可以直接只用一个信息参数;
{
linklist *p = (linklist*)malloc(sizeof(linklist));
if(p == NULL) printf("hmalloc failed\n");
p->prev = NULL;
p->data = data;
p->next = head->next;
p->prev = head; //头指针,头节点,首元指针;
if(p->next != NULL){
p->next->prev = p;
}
head->next = p;
}
void *list_TailInsert()
{
int data;
printf("输入插尾节点数据:\n");
scanf("%d", &data);
linklist *p = (linklist*)malloc(sizeof(linklist));
if(p == NULL) printf("tinsert failed\n");
p->data = data;
p->prev = last_node;
last_node->next = p;
p->next = NULL;
last_node = p;
}
void *list_AtInsert(int data, linklist *head, int index)
{
linklist *p = head,*node = (linklist*)malloc(sizeof(linklist));
if(p == NULL) printf("Atinsert failed\n");
node->data = data;
int cnt = 1;//计数当前节点下标;
p = p->next;//跳过头节点--空节点;
while(p && cnt != index)
{
p = p->next;
cnt ++;
}
p->prev->next = node;
node->prev = p->prev;
p->prev = node;
node->next = p;
}
来源:CSDN
作者:dylan_sjc
链接:https://blog.csdn.net/dylan_sjc/article/details/104131258