Data Structure Lecture-3 Prepared by: Shipra Shukla Assistant Professor Kaziranga University

Preview:

Citation preview

Data StructureLecture-3

Prepared by:Shipra Shukla

Assistant ProfessorKaziranga University

Link List Overview• A data structure in which each element is dynamically allocated and in which

elements point to each other to define a linear relationship

• Linked lists• Abstract data type (ADT)

• Basic operations of linked lists• Insert, find, delete, print, etc.

• Variations of linked lists• Circular linked lists• Doubly linked lists

Linked Lists

• A linked list is a series of connected nodes• Each node contains at least• A piece of data (any type)• Pointer to the next node in the list

• Head: pointer to the first node• The last node points to NULL

A

Head

B C

A

data pointer

node

Anatomy of a linked list• A linked list consists of:• A sequence of nodes

4

a b c d

Each node contains a valueand a link (pointer or reference) to some other node

The last node contains a null link

The list may (or may not) have a header

head

More terminology

• A node’s successor is the next node in the sequence• The last node has no successor

• A node’s predecessor is the previous node in the sequence• The first node has no predecessor

• A list’s length is the number of elements in it• A list may be empty (contain no elements)

5

Cont..• A struct definition that contains variables holding information

about something and that has a pointer to a struct of its same type.

• Every time an element was created, it would create a new element.

• Each of these individual structs or classes in the list is commonly known as a node or element of the list.

Linked Liststruct node {int a;struct node *next;

}; struct node *head;

8

a

next

a

next

a

next

a

next

Building LinkList

struct node* BuildOneTwoThree() {struct node* head = NULL;struct node* second = NULL;struct node* third = NULL;head = malloc(sizeof(struct node)); // allocate 3 nodes in the heapsecond = malloc(sizeof(struct node));third = malloc(sizeof(struct node));head->data = 1; // setup first nodehead->next = second; // note: pointer assignment rulesecond->data = 2; // setup second nodesecond->next = third;third->data = 3; // setup third linkthird->next = NULL;// At this point, the linked list referenced by "head"// matches the list in the drawing.return head;}

Example

node *create_list() { int k, n; node *p, *head; printf ("\n How many elements to enter?"); scanf("%d", &n); for (k=0; k<n; k++) { if (k == 0) {head = (node *) malloc(sizeof(node)); p = head; }else {p->next = (node *) malloc(sizeof(node)); p = p->next; }scanf("%d %s %d", &p->roll, &p->name, &p->age); } p->next = NULL; return (head);}

To be called from main()function as:

node *head;………head = create_list();

TRAVERSING A LINKED LIST• LIST be a linked list in memory stored in linear arrays INFO and LINK with

START pointing to the first element and NULL indicating the end of LIST.• variable PTR which points to the node that is currently being processed• LINK[PTR] points to the next node to be processed.• PTR := LINK[PTR]• Process INFO[PTR], the information at the second node

Algorithm: Let LIST be a linked list in memory. Thisalgorithm traverses LIST, applying an operation PROCESS to eachelement of LIST. 1. Set PTR := START. [Initializes pointer PTR].2. Repeat Steps 3 and 4 while PTR # NULL.3. Apply PROCESS to INFO[PTR].4. Set PTR:=LINK[PTR]. [PTR now points to the next node.][End of Step 2 loop.]5. Exit.

PRINTING A LINKED LISTPRINT(INFO, LINK, START)This procedure prints the information at each node of the list.1. Set PTR := START.2. Repeat Steps 3 and 4 while PTR # NULL:3. Write: INFO[PTR].4. Set PTR := LINK[PTR]. [Updates pointer.][End of Step 2 loop.]5. Return.

Inserting a node in beginning

void insertbegin (int item){P= (node *) malloc (sizeof(node));P->info=item;If(start== null)P->next=null;elseP->next=start;Start=p;}

Inserting a node at endvoid insertend (int item){Node*p,*loc;P= (node *) malloc (sizeof(node));P->info=item;P->next=null;If(start==null){start=p;}else{loc=start;While(loc->next!=null){loc=loc->next;loc->next=p;}}

Inserting a node at location

void insertpos (int item,int loc){node*p,*temp;int k;temp=start;for(k=0;k<loc;k++){ temp= temp->next;if(temp==null){printf(“node is less than one”);return;}} p= (node *) malloc (sizeof(node));p->info=item;p->next=loc->next;loc->next=p;}

Deleting a node in beginningprintf("Deleting from beginning\n");if (head != NULL){p = head;head = head->next;free(p);}

/*Empty list: i.e. head==NULL, do nothing*/print_list(head); /*Display the data in the list*/

Deleting a node at endprintf("Deleting from end\n");if (head != NULL){p = head;while (p->next != NULL){q = p;p = p->next;}q->next = NULL;free(p);}print_list(head); /*Display the data in the list*/

Deleting a node at locationDeleting after an elementprintf("Deleting after\n");scanf("%d", &a);p = head;while ((p != NULL) && (p->data != a))p = p->next;if (p != NULL){q = p->next;if (q != NULL){p->next = q->next;free(q);}}print_list(head); /*Display the data in the list*/

Algorithm: Push in stack

Algorithm: Pop in stack

Circular link list insert at beginningnode * insertfirst(node*start){node*pp=(node*)malloc(sizeof(node));printf(“enter the no.”);scanf(“%d”,&p->num);if(start==null){p->next=p;start=p;last=p;}else{p->next=start;start=p;last->next=p;}}

Circular link list insert at lastnode * insertlast(node*start){node*pp=(node*)malloc(sizeof(node));printf(“enter the no.”);scanf(“%d”,&p->num);if(start==null){p->next=p;start=p;last=p;}else{last->next=p;last=p;last->next=start;}return(start);}

Circular link list delete at beginnode *delete_first(node*start){node*pp=start;if(p==null){printf(“list empty”);}else{p=start;start=start->next;last->next=p;printf(“element deleted id=%d”, p->num);free(p);

}return(start);}

Circular link list delete at lastnode *delete_last(node*start){node*p,*q;p=start;if(p==null){printf(“list empty”);}else{while(p->next!=last){q=p;p=p->next;}printf(“element deleted id=%d”, p->num);q->next=p->next;last=q;}return(start);}

Recommended