C语言之双向链表详解及实例代码

1,双向链表简介。

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表

2,例子要求:

完成双向链表的插入、删除以及查找,将学生管理系统使用的数组,以双向链表的方式实现,能够支持无限制的学生人数的增删改查以及保存。

3,代码实现。

#include <stdio.h>

#include <string.h>

#include <stdarg.h>

#include <stdlib.h>

typedef struct Student{

char name[20];

int score;

char phoneNum[14];

} str_student;

typedef struct Node{

str_student data;

struct Node *prior; //指向前驱结点

struct Node *next; //指向后继结点

}Node, *DLinkList;

// 初始化一个学生链表

DLinkList initDouLinkList()

{

Node *L,*p,*r;

char name[20];

char phone[14];

int score;

L = (Node *)malloc(sizeof(Node));

L->next = NULL;

r = L;

r->next = NULL;

while(1)

{

p = (Node *)malloc(sizeof(Node));

printf("input name is out exit,input student name:\n");

scanf("%s",name);

if (strcmp(name,"out")==0)

{

break;

}

strcpy(p->data.name, name);

printf("input student score:");

scanf("%d",&score);

p->data.score = score;

printf("input student phone:");

scanf("%s",phone);

strcpy(p->data.phoneNum, phone);

p->next = r->next;

r->next = p;

r = p;

}

r->next = NULL;

return L;

}

//添加学生信息

DLinkList insertDouLinkListStuent(DLinkList L,int i,char *name, int score,char *phonenum)

{

DLinkList p,s;

p = L->next;

int tempi;

for(tempi = 1;tempi < i-1; tempi++)

p = p->next;

s = (Node *)malloc(sizeof(Node));

s->data.score = score;

strcpy(s->data.name,name);

strcpy(s->data.phoneNum,phonenum);

s->next = p->next;

p->next->prior = s;

s->prior = p;

p->next = s;

return L;

}

// 查找学生信息

int findDouLinkListStudent(DLinkList L,char *name)

{

DLinkList p;

p = L->next;

int i = 1;

while(p != NULL && (strcmp(p->data.name, name)!=0))

{

++i;

p = p->next;

}

if(p == NULL)

return 0;

else return i;

}

// 移除一个学生

DLinkList removeDouLinkListStudent(DLinkList L,char *name)

{

int tempi = 1;

DLinkList p;

p = L->next;

int i =findDouLinkListStudent(L,name);

while((tempi++) != i && p != NULL)

{

p = p->next;

}

if(p == NULL)

printf("no list \n");

else if(p->next == NULL)

{

p->prior->next = NULL;

free(p);

}

else

{

p->prior->next = p->next;

p->next->prior = p->prior;

free(p);

}

return L;

}

// 铺助打印信息

void printfInfo(DLinkList L)

{

DLinkList p;

p = L->next;

while (p!=NULL)

{

printf("student name %s\n",p->data.name);

printf("student name %d\n",p->data.score);

printf("student name %s\n",p->data.phoneNum);

p=p->next;

}

}

void main ()

{

char name2[20]="hanmeimei";

char phone2[14]="13612345678";

DLinkList L =initDouLinkList();

// 2.1 初始化学生双向链表数据

insertDouLinkListStuent(L,1,name2,99,phone2);

printfInfo(L);

// 2.2 查找学生zhangsan

findDouLinkListStudent(L,'zhangsan');

printfInfo(L);

// 2.3 删除学生zhangsan

removeDouLinkListStudent(L,'zhangsan');

printfInfo(L);

// 2.4 添加学生zengteng

insertDouLinkListStuent(L,9,'zengteng',89,'13643345667');

printfInfo(L);

}

以上是 C语言之双向链表详解及实例代码 的全部内容, 来源链接: utcz.com/z/329888.html

回到顶部