双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
#include <stdio.h>
#include <stdlib.h>
#define ERROR printf("ERROR");
#define MAXSIZE 20
#define YES "yes"
typedef struct student {
char name[MAXSIZE];
struct student *Prior,*Next;
}Node,*LinkList;
struct student *CreatList(int n){
int i;
LinkList p1,p2,head;
head = (LinkList)malloc(sizeof(Node));
head->name[0] = '0';
head->Prior = NULL;
head->Next = NULL;
p2 = head;
printf("Please input the intenger array:\n");
for(i=0;i<n;i++){
p1 = (LinkList)malloc(sizeof(Node));
scanf("%s",p1->name);
p2->Next = p1;
p1->Prior = p2;
p1->Next = NULL;
p2 = p1;
}
p1->Next = NULL;
return head;
}
//查找元素
Node *search(LinkList h,char* E)
{
LinkList p;
p = h->Next;
while(p){
if(!(strcmp(p->name,E)))
return p;
else
p = p->Next;
}ERROR
return 0;
}
void ElementDelete(LinkList pt)
{
/*方法1:
LinkList qt;
qt = pt->Prior;
pt = qt->Next;
qt->Next = pt->Next;
free(pt);*/
//方法2:
pt->Next->Prior = pt->Prior;
pt->Prior->Next = pt->Next;
free(pt);
}
int main(int argc, char *argv[]) {
int n,name;
char FindName[MAXSIZE],st[3];
LinkList p,q,head;
printf("Please input the chain length:\n");
scanf("%d",&n);
head = CreatList(n);
p = head->Next;
printf("Now the chain is:\n");
while(p){
printf("%s\t",p->name);
p = p->Next;
}
printf("\n");
printf("Please enter the name you want to find:\n");
scanf("%s",FindName);
q = search(head,FindName);
if(q){
printf("已找到:%s\nAre you sure to delete it?('yes'or'no'):\n",q->name);
}
scanf("%s",st);
if(!(strcmp(YES,st))){
ElementDelete(q);
p = head->Next;
printf("Now the chain is:\n");
while(p){
printf("%s\t",p->name);
p = p->Next;
}
}
else
printf("Exited");
getch();
return 0;
}